#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
const int INF=1e9;
const int maxn=500000+10;
int cnt,head[maxn],nxt[maxn],to[maxn],c[maxn];
int p[2*maxn],fa[2*maxn][20],dep[2*maxn];
ll dis[2*maxn];
P sum[2*maxn];
int n,m;
int q1,q2;
void add(int u,int v,int d)
{
nxt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;c[cnt]=d;
nxt[++cnt]=head[v];to[cnt]=u;head[v]=cnt;c[cnt]=d;
}
void dfs(int u,int f)
{
for (int i=head[u];i;i=nxt[i])
{
int v=to[i];
if (v==f) continue;
dis[v]=dis[u]+c[i];
dep[v]=dep[u]+1;
fa[v][0]=u;
dfs(v,u);
}
}
void _lca(){
for (int j=1;(1<<j)<=n;j++)
for (int i=1;i<=n;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
}
int lca(int a,int b){
if (dep[a]<dep[b]) swap(a,b);
int f=dep[a]-dep[b];
for (int j=0;(1<<j)<=f;j++)
if ((1<<j)&f) a=fa[a][j];
if (a!=b)
{
for (int j=log2(n)+1;j>=0;j--)
{ if (fa[a][j]!=fa[b][j])
a=fa[a][j],b=fa[b][j];
}
a=fa[a][0]; //少了这样一句话
}
return a;
}
bool cmp(int a,int b){
return dep[a]>dep[b];
}
P unit(P t1,P t2){
int a[10];
a[0]=lca(t1.first,t2.first);
a[1]=lca(t1.first,t2.second);
a[2]=lca(t1.second,t2.first);
a[3]=lca(t1.second,t2.second);
sort(a,a+4,cmp);
return P(a[0],a[1]);
}
void build(int rt,int l,int r){
if(l==r)
{
scanf("%d%d",&sum[rt].first,&sum[rt].second);
return;
}
int m=(l+r)/2;
build(rt<<1,l,m); //此处rt<<1忘记打wa了
build(rt<<1|1,m+1,r);
sum[rt]=unit(sum[rt<<1],sum[rt<<1|1]);
}
P query(int rt,int l,int r){
if (q1<=l&&q2>=r) return sum[rt];
int m=(l+r)>>1;
if (q2<=m) return query(rt<<1,l,m);
else if (q1>m) return query(rt<<1|1,m+1,r);
else return unit(query(rt<<1,l,m),query(rt<<1|1,m+1,r));
}
int main()
{
scanf("%d",&n);
for (int i=1;i<n;i++)
{
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
add(u,v,d);
}
dfs(1,1);
_lca();
scanf("%d",&m);
build(1,1,m);
int kase;scanf("%d",&kase);
while (kase--){
scanf("%d%d",&q1,&q2);
P a=query(1,1,m);
ll ans=dis[a.first]+dis[a.second]-2*dis[lca(a.first,a.second)];
printf("%lld\n",ans);
}
return 0;
}