#include<bits/stdc++.h>
using namespace std;
#define re register
const int N=5e5+100;
int n,de[N],anc[N][21],Q;
int out[N],mx_out;
int qq[5002][5002];
struct QUE{int l,r,k;}q[N];
int head[N],to[N],ne[N],tot;
void add(int x,int y){
	out[x]++; mx_out=max(mx_out,out[x]);
	ne[++tot]=head[x];
	to[tot]=y;
	head[x]=tot;
}
void dfs(int u,int fa){
	de[u]=de[fa]+1;
	anc[u][0]=fa;
	for(int i=1;i<=19;i++) anc[u][i]=anc[anc[u][i-1]][i-1];
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa) continue;
		dfs(v,u);
	}
	return;
}
int LCA(int x,int y){
	if(x==y) return x;
	if(de[x]<de[y]) swap(x,y);
	for(int i=19;i>=0;i--) if(de[anc[x][i]]>=de[y]) x=anc[x][i];
	if(x==y) return x;
	for(int i=18;i>=0;i--) if(anc[x][i]!=anc[y][i]) x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
struct tree{int l,r,lca;}t[N*4];
#define lson o<<1
#define rson o<<1|1
void build(int o,int l,int r){
	t[o].l=l,t[o].r=r;
	if(l==r){
		t[o].lca=l;
		return;
	}
	int mid=(l+r)>>1;
	build(lson,l,mid),build(rson,mid+1,r);
	t[o].lca=LCA(t[lson].lca,t[rson].lca);
	return;
}
int query(int o,int l,int r){
	if(t[o].l==l and t[o].r==r) return t[o].lca;
	int mid=(t[o].l+t[o].r)>>1;
	if(r<=mid) return query(lson,l,r);
	else if(l>mid) return query(rson,l,r);
	else return LCA(query(lson,l,mid),query(rson,mid+1,r));
}
int st[23][N],Lg[N];
void work1(){
	Lg[0]=-1;
	for(re int i=1;i<=n;i++) Lg[i]=Lg[i/2]+1;
	for(re int i=1;i<=n;i++) st[0][i]=de[i];
	for(re int k=1;k<=19;k++) for(re int i=1;i+(1<<k)-1<=n;i++) st[k][i]=min(st[k-1][i],st[k-1][i+(1<<(k-1))]);
	for(re int i=1;i<=Q;i++){
		int ans=0;
		for(re int j=q[i].l;j+q[i].k-1<=q[i].r;j++){
			int l=j,r=j+q[i].k-1;
			int len=Lg[r-l+1];
			ans=max(ans,min(st[len][l],st[len][r-(1<<len)+1]));
		}
		printf("%d\n",ans);
	}
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y; scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	dfs(1,0);
	build(1,1,n);
	if(n<=500){
		for(int i=1;i<=n;i++){
			int now=i;
			for(int j=i;j<=n;j++){
				now=LCA(now,j);
				qq[i][j]=de[now];
			}
		}
		cin>>Q;
		while(Q--){
			int l,r,k; scanf("%d%d%d",&l,&r,&k);
			int ans=0; 
			for(int i=l;i+k-1<=r;i++){
				ans=max(ans,qq[i][i+k-1]);
			}
			cout<<ans<<endl;
		}
		return 0;
	}
	else{
		cin>>Q;
		bool yes=1;
		for(int i=1;i<=Q;i++){
			scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
			if(q[i].r-q[i].l+1!=q[i].k) yes=0;
		}
		if(yes){
			for(int i=1;i<=Q;i++) cout<<de[query(1,q[i].l,q[i].r)]<<endl;
			return 0;
		}
		else work1();//Á´µÄÇé¿ö 
	}
	return 0;
}
/*
4
1 3
2 3
2 4
2
1 1 1
2 4 2

6
5 6
6 1
6 2
2 3
2 4
5
2 3 2
2 4 3
1 6 6
1 3 3
5 6 2
*/
