#include<algorithm>
#include<cstdio>
#define _N_ 500005
#define lg std::__lg
int head[_N_],to[_N_*2],nxt[_N_*2],mtp;
int dep[_N_],dfn[_N_],dfn_cnt;
int ST[lg(_N_)+5][_N_],LCA_ST[lg(_N_)+5][_N_];
void add_edge_1(int f,int t){
	mtp++;
	to[mtp]=t;
	nxt[mtp]=head[f];
	head[f]=mtp;
}
void add_edge_2(int x,int y){
	add_edge_1(x,y);
	add_edge_1(y,x);
}
void dfs(int now,int last){
	dep[now]=dep[last]+1;
	ST[0][dfn[now]=++dfn_cnt]=last;
	for(int ptr=head[now];ptr;ptr=ptr[nxt])
		if(to[ptr]!=last)
			dfs(to[ptr],now);
}
int get(int x,int y){
	return dfn[x]<dfn[y]?x:y;
}
int query(int x,int y){
	int len=y-x+1;
	int log=lg(len);
	int loglen=1<<log;
	return get(ST[log][x],ST[log][y-loglen+1]);
}
int LCA(int x,int y){
	if(x==y)return x;
	if(dfn[x]>dfn[y])std::swap(x,y);
	return query(dfn[x]+1,dfn[y]);
}
int range_LCA(int x,int y){
	int len=y-x+1;
	int log=lg(len);
	int loglen=1<<log;
	return LCA(LCA_ST[log][x],LCA_ST[log][y-loglen+1]);
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	int n;
	scanf("%d",&n);
	for(int i=2;i<=n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add_edge_2(x,y);
	}
	for(int i=1;i<=n;i++)
		LCA_ST[0][i]=i;
	dfs(1,0);
	for(int i=1;i<=lg(n);i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			ST[i][j]=get(ST[i-1][j],ST[i-1][j+(1<<i-1)]);
	for(int i=1;i<=lg(n);i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			LCA_ST[i][j]=LCA(LCA_ST[i-1][j],LCA_ST[i-1][j+(1<<i-1)]);
	int q;
	scanf("%d",&q);
	while(q--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		int ans=0;
		for(int len=k;len<=r-l+1;len++)
			for(int L=l;L+len-1<=r;L++){
				int R=L+len-1;
				ans=std::max(ans,dep[range_LCA(L,R)]);
			}
		printf("%d\n",ans);
	}
	return 0;
}
