#include<bits/stdc++.h>
using namespace std;
int n;
int q;
struct node{
	int to;
	int ne;
}e[2000001];
int x;
int y;
int k;
int idx;
int kk;
int flag[1000001];
int h[1000001];
int dep[1000001];
int yin[1000001];
struct nod{
	int l,r;
	int maxx;
}tree[2100001];
int ls(int p){
	return p<<1;
}
int rs(int p){
	return p<<1|1;
}
void push_up(int p){
	tree[p].maxx=max(tree[ls(p)].maxx,tree[rs(p)].maxx);
}
void build(int L,int R,int p){
	tree[p].l=L;
	tree[p].r=R;
	if(tree[p].l==tree[p].r){
		tree[p].maxx=dep[L];
		return ;
	}
	int mid=(L+R)>>1;
	build(L,mid,ls(p));
	build(mid+1,R,rs(p));
	push_up(p);
}
void add(int u,int v){
	e[++idx].to=v;
	e[idx].ne=h[u];
	h[u]=idx;
}
void dfs(int d,int f){
	flag[d]=1;
	dep[d]=dep[f]+1;
	yin[dep[d]]=d;
	for(int i=h[d];i!=0;i=e[i].ne){
		int j=e[i].to;
		if(!flag[j]){
			dfs(j,d);
		}
	}
}
void query(int L,int R,int p){
	if(tree[p].l>=L&&tree[p].r<=R){
		kk=max(kk,tree[p].maxx);
		return ;
	}
	if(tree[ls(p)].r>=L){
		query(L,R,ls(p));
	}
	if(tree[rs(p)].l<=R){
		query(L,R,rs(p));
	}
}
int check(int shu){
	kk=0;
	if(yin[shu]-k+1>=x){
		query(yin[shu]-k+1,yin[shu],1);
		if(kk==shu){
			return 1;
		}
	}
	kk=0;
	if(yin[shu]+k-1<=y){
		query(yin[shu],yin[shu]+k-1,1);
		if(kk==shu){
			return 1;
		}
	}
	return 0;
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n-1;i++){
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	cin>>q;
	dfs(1,0);
	build(1,n,1);
	for(int i=1;i<=q;i++){
		cin>>x>>y>>k;
		cout<<y-k+1<<endl;
	}
	return 0;
}
