#include <bits/stdc++.h>
#include <iomanip>
#include <math.h>
#include <unistd.h>
#include <stdio.h>
#define rep(i,x) for(ll i = 0;i<x;i++)
#define all(a) (a).begin(),(a).end()
#define vecin(a) rep(i,a.size())cin >> a[i]
#define vecout(a) rep(i,a.size())cout << a[i] << " ";cout << "\n"
#define vecvec(a) vector<vector<(a)>>
using ll = long long;
using ld = long double;
using namespace std;
using dou = double;
const ll inf = 2147483647;
const ll INF = 1LL << 60;
const ld pi = 3.14159265358;
const ll mod = 1000000007;
typedef pair<ll,ll> P;
using graph = vector<vector<ll>>;
template<class T> inline bool chmax(T& a, T b){if(a < b){a = b; return true;}return false;}
template<class T> inline bool chmin(T& a, T b){if(a > b){a = b; return true;}return false;}
template<class T> inline bool change(T a,T b){if(a > b){swap(a,b);return true;}return false;}
ll gcd(ll a,ll b){
    if(a < b)swap(a,b);
    if(a % b == 0)return b;
    else return gcd(b,a%b);
}
//素数判定O(sqrt(N))
bool isp(ll n){
    bool res = true;
    if(n == 1)return false;
    else{
        for(ll i = 2;i * i <= n;i++){
            if(n % i == 0){
                res = false;
                break;
            }
        }
        return res;
    }
}
const ll cmax = 1000000;
ll fac[cmax], finv[cmax], inv[cmax];

// テーブルを作る前処理
void COMinit() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (ll i = 2; i < cmax; i++){
        fac[i] = fac[i - 1] * i % mod;
        inv[i] = mod - inv[mod%i] * (mod / i) % mod;
        finv[i] = finv[i - 1] * inv[i] % mod;
    }
}

// 二項係数計算
ll nCk(ll n, ll k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % mod) % mod;
}
//nのm乗をMODで割ったあまりO(logN)
ll modpow(ll n,ll m,ll MOD){
    ll res = 1;
    while(m){
        if(m & 1)res = (res * n) % MOD;
        m >>= 1;
        n *= n;
        n %= MOD;
    }
    return res;
}

//printf("%.10f\n", N);
/*  vector<ll> vec = {1,2,5,6,8,9,10};
    cout << binary_search(all(vec),5) << endl; -> true*/
/*
    vector<ll> vec = {1,2,5,6,8,9,10};
    auto n = upper_bound(all(vec),4);
    cout << *n << endl; -> 5*/

//    cout << fixed << setprecision(15);
struct edge{ll to,cost;};
ll N;const ll NMAX = 100005LL;
vector<edge> G[NMAX];
vector<ll> dist(NMAX,INF);
void dfs(ll from,ll par,ll d){
    dist[from] = d;
    for(auto x : G[from]){
        if(x.to != par){
            dfs(x.to,from,d + x.cost);
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    ll a,b,c;
    cin >> N;
    rep(i,N - 1){
        cin >> a >> b >> c;
        a--;b--;
        G[a].push_back({b,c});
        G[b].push_back({a,c});
    }
    ll Q,K;
    cin >> Q >> K;
    dist[K - 1] = 0;
    dfs(K - 1,-1,0);
    ll A,B;
    rep(i,Q){
        cin >> A >> B;
        cout << dist[A - 1] + dist[B - 1] << "\n";
    }
}
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define mp make_pair
#define pb push_back
#define vll vector<ll>
#define endl "\n"
#define pll pair<ll,ll>
#define all(x) (x).begin() , (x).end()
#define f first
#define s second
#define pr(x) cout<<x<<endl;
#define pr2(x,y) cout<<x<<" "<<y<<endl;
#define pr3(x,y,z) cout<<x<<" "<<y<<endl;
#define prv(v) for(auto x:v) cout<<x<<" ";
using namespace std;
 
const ll N =(2e5+5);
const ll MOD = 1e9+7;
const ll INF = 1e16;
const ll LOG = 29;

long long binpow(long long a, long long b) {
     a %= MOD;
    long long res = 1;
    while (b > 0) {
        if (b & 1)
            res = (res * a)%MOD ;
        a = (a * a)%MOD ;

        
        b >>= 1;
    }
    res%=MOD;
    return res;
}
vll adj[N];
vll adj2[N];
ll col[N];
ll col2[N];
bool vis[N];
bool vis2[N];
map<pll,ll> gg;
    void dfs(ll x,ll c)
        {
            vis[x]=true;    
            col[x]=c; 
            for(auto i : adj[x])
            {
                if(vis[i]==false)
                {
                    dfs(i,c);
                }
            }
        }    

    void dfs2(ll x,ll c)
        {
            vis2[x]=true;    
            col2[x]=c; 
            for(auto i : adj2[x])
            {
                if(vis2[i]==false)
                {
                    dfs2(i,c);
                }
            }
        }    

void solve(){
    ll n,k,l;
    cin>>n>>k>>l;
    for(int i =1;i<=k;i++){
        ll u,v;
        cin>>u>>v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    for(int i = 1;i<=l;i++){
        ll u,v;
        cin>>u>>v;
        adj2[u].pb(v);
        adj2[v].pb(u);
    }
    ll cur = 1;
    for(int i =1;i<=n;i++){
        if(!vis[i]){
            dfs(i,cur);
            cur++;
        }
    }
    cur =1;
    for(int i =1;i<=n;i++){
        if(!vis2[i]){
            dfs2(i,cur);
            cur++;
        }
    }

    for(int i =1;i<=n;i++){
        gg[mp(col[i],col2[i])]++;
    }
    for(int i =1;i<=n;i++){
        cout<<gg[mp(col[i],col2[i])]<<" ";
    }
    cout<<endl;

}






int main()
{
    ios_base::sync_with_stdio(0);
     cin.tie(NULL);
     
    ll t=1;
    while(t--){
        solve();
    }
     
 
 
    return 0;     
    
        
}