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



"""

参考：https://img.atcoder.jp/abc070/editorial.pdf

・公式解が再帰だったのでやってみる

"""



import sys



# 再帰呼び出しの回数制限(デフォルト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 -*-
"""
参考：https://img.atcoder.jp/abc070/editorial.pdf
・公式解が再帰だったのでやってみる
"""
import sys

# 再帰呼び出しの回数制限(デフォルト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]))

-""" -参考：https://img.atcoder.jp/abc070/editorial.pdf -・公式解が再帰だったのでやってみる -""" -# 再帰呼び出しの回数制限(デフォルト1000) -sys.setrecursionlimit(10**9) + +def input(): +    return sys.stdin.readline().strip() + + +from heapq import heappop, heappush + +# 今回はダイクストラするので、データの持ち方は隣接リスト -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) +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 -dfs(K, -1, 0) +# 引数：(ノードの隣接リスト, 出発ノード) +memo = dijkstra(nodes, K)