#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,q,a,b,k,L,R,len,ans;
int f[N][21],Lca[N][21],Log[N],head[N],dep[N],du[N],cnt[5];
struct AB{
	int a,b,n;
}d[N*2];
void cun(int a,int b){
	d[++k].a=a,d[k].b=b;
	d[k].n=head[a],head[a]=k;
}
void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	Lca[u][0]=u;
	for(int i=head[u]; i; i=d[i].n){
		int v=d[i].b;
		if(v==fa) continue;
		dfs(v,u);
	} 
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	int dt=dep[x]-dep[y];
	for(int i=20; i>=0; i--){
		if(dt>=(1<<i)){
			dt-=(1<<i);
			x=f[x][i];
		}
	}
	if(x==y) return x;
	for(int i=20; i>=0; i--){
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}
int query(int l,int r){
	int k=Log[r-l+1];
	return lca(Lca[l][k],Lca[r-(1<<k)+1][k]);
}
bool checklian(){
	for(int i=1; i<=n; i++){
		if(du[i]>2) return 0;
		cnt[du[i]]++;
	}
	if(cnt[1]==2 && cnt[2]==n-2) return 1;
	else return 0;
}
bool check(int mid){
	int lx=0;
	for(int i=L; i<=R; i++){
		if(dep[i]>=mid) lx++;
		else lx=0;
		if(lx>=mid) return 1;
	}
	return 0;
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	Log[1]=0;
	for(int i=2; i<=5e5; i++) Log[i]=Log[i>>1]+1;
	scanf("%d",&n);
	for(int i=1; i<n; i++){
		scanf("%d%d",&a,&b);
		cun(a,b),cun(b,a);
		du[a]++,du[b]++;
	}
	dfs(1,0);
	for(int j=1; j<21; j++){
		for(int i=1; i<=n; i++) f[i][j]=f[f[i][j-1]][j-1];
	}
	for(int j=1; j<21; j++){
		for(int i=1; i+(1<<j)-1<=n; i++) Lca[i][j]=lca(Lca[i][j-1],Lca[i+(1<<(j-1))][j-1]);
	} 
	scanf("%d",&q);
	while(q--){
		scanf("%d%d%d",&L,&R,&len);
		ans=0;
		for(int i=L; i+len-1<=R; i++) ans=max(ans,dep[query(i,i+len-1)]);
		printf("%d\n",ans);
	}
	return 0;
}

