using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCorder
{
	public class Program
	{
		static void Main(string[] args)
		{
			var cin = new Scanner2();
			int n = cin.Int();
			List<Tuple<int, int>>[] to = new List<Tuple<int, int>>[n];
			for (int i = 0; i < n; i++) {
				to[i] = new List<Tuple<int, int>>();
			}

			for (int i = 0; i < n - 1; i++) {
				int a = cin.Int() - 1;
				int b = cin.Int() - 1;
				int c = cin.Int();
				to[a].Add(new Tuple<int, int>(b, c));
				to[b].Add(new Tuple<int, int>(a, c));
			}

			int q = cin.Int();
			int k = cin.Int();

			long[] dist = new long[n];
			for (int i = 0; i < n; i++) {
				dist[i] = -1;
			}

			var nq = new Queue<int>();
			dist[k - 1] = 0;
			nq.Enqueue(k - 1);
			while (nq.Count > 0) {
				int src = nq.Dequeue();
				foreach (var next in to[src]) {
					if (dist[next.Item1] == -1) {
						dist[next.Item1] = dist[src] + next.Item2;
						nq.Enqueue(next.Item1);
					}
				}
			}

			var sb = new StringBuilder();
			for (int i = 0; i < q; i++) {
				int x = cin.Int() - 1;
				int y = cin.Int() - 1;
				long d = dist[x] + dist[y];
				sb.AppendLine(d.ToString());
			}

			Console.WriteLine(sb.ToString());
		}
	}

	public class UnionFind
	{
		private List<int> sizes_;
		private List<int> parents_;

		public int Count { get; private set; }
		public int GroupCount { get; private set; }

		public UnionFind(int count)
		{
			parents_ = new List<int>(count);
			sizes_ = new List<int>(count);

			Count = 0;
			GroupCount = 0;

			ExtendSize(count);
		}
		public bool TryUnite(int x, int y)
		{
			int xRoot = Find(x);
			int yRoot = Find(y);
			if (yRoot == xRoot) {
				return false;
			}

			int parent = sizes_[xRoot] < sizes_[yRoot] ? yRoot : xRoot;
			int child = sizes_[xRoot] < sizes_[yRoot] ? xRoot : yRoot;

			GroupCount--;
			parents_[child] = parent;
			sizes_[parent] += sizes_[child];

			return true;
		}
		public IEnumerable<int> AllRepresents => parents_.Where(x => x == parents_[x]);
		public int GetSize(int x) => sizes_[Find(x)];

		public int Find(int x)
		{
			while (x != parents_[x]) {
				parents_[x] = parents_[parents_[x]];
				x = parents_[x];
			}

			return x;
		}

		public void ExtendSize(int treeSize)
		{
			if (treeSize <= Count) {
				return;
			}

			parents_.Capacity = treeSize;
			sizes_.Capacity = treeSize;
			while (Count < treeSize) {
				parents_.Add(Count);
				sizes_.Add(1);
				Count++;
				GroupCount++;
			}
		}
	}

	public class Scanner2
	{
		private readonly char[] delimiter_ = new char[] { ' ' };
		private readonly string filePath_;
		private string[] buf_;
		private int index_;
		Func<string> reader_;

		public Scanner2(string file = "")
		{
			if (string.IsNullOrWhiteSpace(file)) {
				reader_ = Console.ReadLine;
			} else {
				filePath_ = file;
				var fs = new StreamReader(file);
				reader_ = fs.ReadLine;
			}
			buf_ = new string[0];
			index_ = 0;
		}

		public string Next()
		{
			if (index_ < buf_.Length) {
				return buf_[index_++];
			}

			string st = reader_();
			while (st == "") {
				st = reader_();
			}

			buf_ = st.Split(delimiter_, StringSplitOptions.RemoveEmptyEntries);
			if (buf_.Length == 0) {
				return Next();
			}

			index_ = 0;
			return buf_[index_++];
		}

		public int Int() => int.Parse(Next());
		public long Long() => long.Parse(Next());
		public double Double() => double.Parse(Next());

		public int[] ArrayInt(int N, int add = 0)
		{
			int[] Array = new int[N];
			for (int i = 0; i < N; i++) {
				Array[i] = Int() + add;
			}
			return Array;
		}

		public long[] ArrayLong(int N, long add = 0)
		{
			long[] Array = new long[N];
			for (int i = 0; i < N; i++) {
				Array[i] = Long() + add;
			}
			return Array;
		}

		public double[] ArrayDouble(int N, double add = 0)
		{
			double[] Array = new double[N];
			for (int i = 0; i < N; i++) {
				Array[i] = Double() + add;
			}
			return Array;
		}

		public void Save(string text)
		{
			if (string.IsNullOrWhiteSpace(filePath_)) {
				return;
			}

			File.WriteAllText(filePath_ + "_output.txt", text);
		}
	}
}

Measured memory_bytes: 45092