# -*- coding: utf-8 -*-



import sys

def input(): return sys.stdin.readline().strip()

    

from heapq import heappop, heappush



# 今回はダイクストラするので、データの持ち方は隣接リスト

N = int(eval(input()))

nodes = [[] for _ in range(N+1)]

for i in range(N-1):

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

    # nodes[出発ノード](到着ノード, コスト))

    nodes[a].append((b, c))

    # 無向グラフなのでこっちも入れる

    nodes[b].append((a, c))



def dijkstra(nodes, start):

    # 最短距離メモ

    memo = [float('inf')] * (len(nodes))

    # スタート位置

    que = [(0, start)]

    memo[start] = 0

    # キューが空になるまで

    while len(que) != 0:

        # startからの距離, 現在のノード

        dist, cur = heappop(que)

        # 出発ノードcurの到着ノードでループ

        for nxt, cost in nodes[cur]:

            # 今回の経路のが短い時

            if memo[cur] + cost < memo[nxt]:

                memo[nxt] = memo[cur] + cost

                # 現在の移動距離をキューの優先度として、早い方から先に処理するようにする

                heappush(que, (memo[nxt], nxt))

    # ノードstartからの最短距離リストを返却

    return memo



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

# 引数：(ノードの隣接リスト, 出発ノード)

memo = dijkstra(nodes, K)



for i in range(Q):

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

    # 今回は全てKを経由するので、Kからの距離さえ分かれば全部出る

    print((memo[x] + memo[y]))

# -*- coding: utf-8 -*-



import sys

def input(): return sys.stdin.readline().strip()



# 再帰呼び出しの回数制限(デフォルト1000)

sys.setrecursionlimit(10 ** 9)



N = int(eval(input()))

nodes = [[] for _ in range(N+1)]

for i in range(N-1):

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

    # nodes[出発ノード](到着ノード, コスト))

    nodes[a].append((b, c))

    # 無向グラフなのでこっちも入れる

    nodes[b].append((a, c))



memo = [0] * (N+1)

def dfs(cur, prev, dist):

    memo[cur] = dist

    for nxt, cost in nodes[cur]:

        if nxt == prev:

            continue

        dfs(nxt, cur, dist+cost)



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

dfs(K, -1, 0)



for i in range(Q):

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

    # 今回は全てKを経由するので、Kからの距離さえ分かれば全部出る

    print((memo[x] + memo[y]))

# -*- coding: utf-8 -*-
import sys


def input():
    return sys.stdin.readline().strip()


from heapq import heappop, heappush

# 今回はダイクストラするので、データの持ち方は隣接リスト
N = int(eval(input()))
nodes = [[] for _ in range(N + 1)]
for i in range(N - 1):
    a, b, c = list(map(int, input().split()))
    # nodes[出発ノード](到着ノード, コスト))
    nodes[a].append((b, c))
    # 無向グラフなのでこっちも入れる
    nodes[b].append((a, c))


def dijkstra(nodes, start):
    # 最短距離メモ
    memo = [float("inf")] * (len(nodes))
    # スタート位置
    que = [(0, start)]
    memo[start] = 0
    # キューが空になるまで
    while len(que) != 0:
        # startからの距離, 現在のノード
        dist, cur = heappop(que)
        # 出発ノードcurの到着ノードでループ
        for nxt, cost in nodes[cur]:
            # 今回の経路のが短い時
            if memo[cur] + cost < memo[nxt]:
                memo[nxt] = memo[cur] + cost
                # 現在の移動距離をキューの優先度として、早い方から先に処理するようにする
                heappush(que, (memo[nxt], nxt))
    # ノードstartからの最短距離リストを返却
    return memo


Q, K = list(map(int, input().split()))
# 引数：(ノードの隣接リスト, 出発ノード)
memo = dijkstra(nodes, K)
for i in range(Q):
    x, y = list(map(int, input().split()))
    # 今回は全てKを経由するので、Kからの距離さえ分かれば全部出る
    print((memo[x] + memo[y]))

# -*- coding: utf-8 -*-
import sys


def input():
    return sys.stdin.readline().strip()


# 再帰呼び出しの回数制限(デフォルト1000)
sys.setrecursionlimit(10**9)
N = int(eval(input()))
nodes = [[] for _ in range(N + 1)]
for i in range(N - 1):
    a, b, c = list(map(int, input().split()))
    # nodes[出発ノード](到着ノード, コスト))
    nodes[a].append((b, c))
    # 無向グラフなのでこっちも入れる
    nodes[b].append((a, c))
memo = [0] * (N + 1)


def dfs(cur, prev, dist):
    memo[cur] = dist
    for nxt, cost in nodes[cur]:
        if nxt == prev:
            continue
        dfs(nxt, cur, dist + cost)


Q, K = list(map(int, input().split()))
dfs(K, -1, 0)
for i in range(Q):
    x, y = list(map(int, input().split()))
    # 今回は全てKを経由するので、Kからの距離さえ分かれば全部出る
    print((memo[x] + memo[y]))

-from heapq import heappop, heappush - -# 今回はダイクストラするので、データの持ち方は隣接リスト +# 再帰呼び出しの回数制限(デフォルト1000) +sys.setrecursionlimit(10**9) +memo = [0] * (N + 1) -def dijkstra(nodes, start): -    # 最短距離メモ -    memo = [float("inf")] * (len(nodes)) -    # スタート位置 -    que = [(0, start)] -    memo[start] = 0 -    # キューが空になるまで -    while len(que) != 0: -        # startからの距離, 現在のノード -        dist, cur = heappop(que) -        # 出発ノードcurの到着ノードでループ -        for nxt, cost in nodes[cur]: -            # 今回の経路のが短い時 -            if memo[cur] + cost < memo[nxt]: -                memo[nxt] = memo[cur] + cost -                # 現在の移動距離をキューの優先度として、早い方から先に処理するようにする -                heappush(que, (memo[nxt], nxt)) -    # ノードstartからの最短距離リストを返却 -    return memo +def dfs(cur, prev, dist): +    memo[cur] = dist +    for nxt, cost in nodes[cur]: +        if nxt == prev: +            continue +        dfs(nxt, cur, dist + cost) -# 引数：(ノードの隣接リスト, 出発ノード) -memo = dijkstra(nodes, K) +dfs(K, -1, 0)