#include<bits/stdc++.h>
#define N 500010
using namespace std;
int n,Q,cnt,lg[N],dep[N],head[N],St[21][N],f[N][21],To[N<<1],Nxt[N<<1];
void add(int from,int to){
	To[++cnt]=to;
	Nxt[cnt]=head[from];
	head[from]=cnt;
}
void dfs(int now,int fa){
	dep[now]=dep[fa]+1;
	f[now][0]=fa;
	for(int i=1;i<=20;i++)
		f[now][i]=f[f[now][i-1]][i-1];
	for(int i=head[now];i;i=Nxt[i])
		if(To[i]^fa)dfs(To[i],now);
}
inline int Get_Lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=20;i>=0;i--)
		if(dep[f[x][i]]>=dep[y])
			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];
}
void St_Build(){
	for(int i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	for(int i=1;i<n;i++)
		St[0][i]=dep[Get_Lca(i,i+1)];
	for(int i=1;i<=20;i++)
		for(int j=1;j+(1<<i)<=n;j++)
			St[i][j]=min(St[i-1][j],St[i-1][j+(1<<i-1)]);
}
inline int Query(int l,int r){
	int k=lg[r-l+1];
	return min(St[k][l],St[k][r-(1<<k)+1]);
}
int Solve(int l,int r,int k){
	int Res=0;
	for(int Len=k;Len<=r-l+1;Len++)
		for(int L=l,R=l+Len-1;R<=r;L++,R++)
			Res=max(Res,Len==1?dep[L]:Query(L,R-1));
	return Res;
}
int main(){
	freopen("query.in","r",stdin);
	froepen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++){
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	dfs(1,0);
	St_Build();
	scanf("%d",&Q);
	int l,r,k;
	while(Q--){
		scanf("%d%d%d",&l,&r,&k);
		if(n<=500)printf("%d\n",Solve(l,r,k));
		else if(l==r)printf("%d\n",dep[l]);
		else printf("%d\n",Query(l,r-1));
	}
}