import sys

input=sys.stdin.readline



# 頂点 s からの最短距離を求める (存在しないときはinf)

# n: 頂点数, edge[i]: 頂点 i からの [cost, dst] の list (heapq のため cost が先)

# O(|E|log|V|)

import heapq

def dijkstra(s,n,edge):

    d = [float("inf")] * n # s からの距離

    d[s] = 0

    q = [] # 頂点への距離を管理する。ヒープにする

    for e in edge[s]:

        heapq.heappush(q, e)

    

    while q:

        minedge = heapq.heappop(q)

        v = minedge[1]

        if d[v] < minedge[0]:

            continue # 最小のもの以降はスルー

        d[v] = minedge[0]

        for e in edge[v]:

            heapq.heappush(q, [e[0]+d[v], e[1]])



    return d



def main():

    N = int(eval(input()))

    edge = [[] for i in range(N)]

    # edge[i] : 頂点 i から出る経路の [重み,行先] の配列

    for _ in range(N-1):

        a,b,c = list(map(int, input().split()))

        edge[a-1].append([c,b-1])

        edge[b-1].append([c,a-1])



    Q,K = list(map(int, input().split()))

    D = dijkstra(K-1, N, edge)



    for _ in range(Q):

        x,y = list(map(int, input().split()))

        print((D[x-1] + D[y-1]))



if __name__ == '__main__':

    main()

import sys

input=sys.stdin.readline

sys.setrecursionlimit(3*10**5) # 大丈夫か？



N = int(eval(input()))

edge = [[] for i in range(N)]

# edge[i] : 頂点 i から出る経路の [距離,行先] の隣接リスト

for _ in range(N-1):

    a,b,c = list(map(int, input().split()))

    edge[a-1].append([c,b-1])

    edge[b-1].append([c,a-1])



D = [-1]*N # K からの距離. 未訪問の場合 -1.

# 今回の問題の場合、木なので経路は 1 通りしか無く、

# K から頂点を順に辿りながらコストを足していくだけで良い

def dfs(src, cost):

    D[src] = cost

    for e in edge[src]:

        if D[e[1]] == -1:

            dfs(e[1], cost + e[0])



def main():

    Q,K = list(map(int, input().split()))

    dfs(K-1, 0)



    for _ in range(Q):

        x,y = list(map(int, input().split()))

        print((D[x-1] + D[y-1]))



if __name__ == '__main__':

    main()

import sys

input = sys.stdin.readline
# 頂点 s からの最短距離を求める (存在しないときはinf)
# n: 頂点数, edge[i]: 頂点 i からの [cost, dst] の list (heapq のため cost が先)
# O(|E|log|V|)
import heapq


def dijkstra(s, n, edge):
    d = [float("inf")] * n  # s からの距離
    d[s] = 0
    q = []  # 頂点への距離を管理する。ヒープにする
    for e in edge[s]:
        heapq.heappush(q, e)
    while q:
        minedge = heapq.heappop(q)
        v = minedge[1]
        if d[v] < minedge[0]:
            continue  # 最小のもの以降はスルー
        d[v] = minedge[0]
        for e in edge[v]:
            heapq.heappush(q, [e[0] + d[v], e[1]])
    return d


def main():
    N = int(eval(input()))
    edge = [[] for i in range(N)]
    # edge[i] : 頂点 i から出る経路の [重み,行先] の配列
    for _ in range(N - 1):
        a, b, c = list(map(int, input().split()))
        edge[a - 1].append([c, b - 1])
        edge[b - 1].append([c, a - 1])
    Q, K = list(map(int, input().split()))
    D = dijkstra(K - 1, N, edge)
    for _ in range(Q):
        x, y = list(map(int, input().split()))
        print((D[x - 1] + D[y - 1]))


if __name__ == "__main__":
    main()

import sys

input = sys.stdin.readline
sys.setrecursionlimit(3 * 10**5)  # 大丈夫か？
N = int(eval(input()))
edge = [[] for i in range(N)]
# edge[i] : 頂点 i から出る経路の [距離,行先] の隣接リスト
for _ in range(N - 1):
    a, b, c = list(map(int, input().split()))
    edge[a - 1].append([c, b - 1])
    edge[b - 1].append([c, a - 1])
D = [-1] * N  # K からの距離. 未訪問の場合 -1.
# 今回の問題の場合、木なので経路は 1 通りしか無く、
# K から頂点を順に辿りながらコストを足していくだけで良い
def dfs(src, cost):
    D[src] = cost
    for e in edge[src]:
        if D[e[1]] == -1:
            dfs(e[1], cost + e[0])


def main():
    Q, K = list(map(int, input().split()))
    dfs(K - 1, 0)
    for _ in range(Q):
        x, y = list(map(int, input().split()))
        print((D[x - 1] + D[y - 1]))


if __name__ == "__main__":
    main()

-# 頂点 s からの最短距離を求める (存在しないときはinf) -# n: 頂点数, edge[i]: 頂点 i からの [cost, dst] の list (heapq のため cost が先) -# O(|E|log|V|) -import heapq - - -def dijkstra(s, n, edge): -    d = [float("inf")] * n  # s からの距離 -    d[s] = 0 -    q = []  # 頂点への距離を管理する。ヒープにする -    for e in edge[s]: -        heapq.heappush(q, e) -    while q: -        minedge = heapq.heappop(q) -        v = minedge[1] -        if d[v] < minedge[0]: -            continue  # 最小のもの以降はスルー -        d[v] = minedge[0] -        for e in edge[v]: -            heapq.heappush(q, [e[0] + d[v], e[1]]) -    return d +sys.setrecursionlimit(3 * 10**5)  # 大丈夫か？ +N = int(eval(input())) +edge = [[] for i in range(N)] +# edge[i] : 頂点 i から出る経路の [距離,行先] の隣接リスト +for _ in range(N - 1): +    a, b, c = list(map(int, input().split())) +    edge[a - 1].append([c, b - 1]) +    edge[b - 1].append([c, a - 1]) +D = [-1] * N  # K からの距離. 未訪問の場合 -1. +# 今回の問題の場合、木なので経路は 1 通りしか無く、 +# K から頂点を順に辿りながらコストを足していくだけで良い +def dfs(src, cost): +    D[src] = cost +    for e in edge[src]: +        if D[e[1]] == -1: +            dfs(e[1], cost + e[0]) -    N = int(eval(input())) -    edge = [[] for i in range(N)] -    # edge[i] : 頂点 i から出る経路の [重み,行先] の配列 -    for _ in range(N - 1): -        a, b, c = list(map(int, input().split())) -        edge[a - 1].append([c, b - 1]) -        edge[b - 1].append([c, a - 1]) -    D = dijkstra(K - 1, N, edge) +    dfs(K - 1, 0)