#include<bits/stdc++.h>
#define MAXN 500010
using namespace std;
bool ST;
int n,m;
#define pb push_back
vector<int>g[MAXN];
int fa[MAXN][20],dep[MAXN];
void dfs(int x,int f){
	fa[x][0]=f,dep[x]=dep[f]+1;
	for(int i=1;i<20;++i) fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int v:g[x]){
		if(v==f) continue;
		dfs(v,x);
	}
}
int LCA(int x,int y){
	if(x==y) return x;
	if(dep[y]>dep[x]) x^=y^=x^=y;
	for(int i=19;i>=0;--i){
		if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	}
	if(x==y) return x;
	for(int i=19;i>=0;--i)
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i],y=fa[y][i];
		}
	return fa[x][0];
}

#define ls now<<1
#define rs now<<1|1
#define mid ((tr[now].l+tr[now].r)>>1)
struct SEG{
	int l,r,s,t;//注意s记录的是LCA具体的点而不是深度 
}tr[MAXN<<2];
void build(int now,int l,int r){
	tr[now]=(SEG){l,r,0,0};
	if(l==r) {tr[now].s=l,tr[now].t=dep[l];return;}
	build(ls,l,mid),build(rs,mid+1,r);
	tr[now].s=LCA(tr[ls].s,tr[rs].s);
	tr[now].t=min(tr[ls].t,tr[rs].t);
}
int query(int now,int s,int t){
	if(s<=tr[now].l&&tr[now].r<=t) return tr[now].s;
	if(t<=mid) return query(ls,s,t);
	if(s>mid) return query(rs,s,t);
	return LCA(query(ls,s,t),query(rs,s,t));
}
int qq(int now,int s,int t){
	if(s<=tr[now].l&&tr[now].r<=t) return tr[now].t;
	if(t<=mid) return qq(ls,s,t);
	if(s>mid) return qq(rs,s,t);
	return min(qq(ls,s,t),qq(rs,s,t));
}

bool CKL(){
	if(g[1].size()>1) return 0;
	bool res=0;
	for(int i=2;i<=n;++i)
		if(g[i].size()<2){
			if(res) return 0;
			res=1;
		}
	return 1;
}
void dfs1(int x,int f){
	dep[x]=dep[f]+1;
	for(int v:g[x]) if(v!=f) dfs1(v,x);
}
#define mm ((l+r)>>1)
int ch[10000000][2],s[10000000];
int rt[MAXN],trn,df[MAXN];
int upd(int pre,int l,int r,int x){
	int now=++trn;
	ch[now][0]=ch[pre][0],ch[now][1]=ch[pre][1],s[now]=s[pre]+1;
	if(l==r) return now;
	if(x<=mm) ch[now][0]=upd(ch[pre][0],l,mm,x);
	else ch[now][1]=upd(ch[pre][1],mm+1,r,x);
	return now;
}
int qry(int pre,int now,int l,int r,int v){
	if(l==r) return df[l];
	int sb=s[ch[now][0]]-s[ch[pre][0]];
	if(v<=sb) return qry(ch[pre][0],ch[now][0],l,mm,v);
	else return qry(ch[pre][1],ch[now][1],mm+1,r,v-sb);
}


int TFL(int l,int r){
	int x=r,md;
	--l,++r;
	while(l+1<r){
		md=(l+r)>>1;
//		cout<<qq(1,md,x)<<endl;
		if(qq(1,md,x)==dep[x]) r=md;
		else l=md;
	}
	return r;
}
int TFR(int l,int r){
	int x=l,md;
	--l,++r;
	while(l+1<r){
		md=(l+r)>>1;
//		cout<<qq(1,x,md)<<endl;
		if(qq(1,x,md)==dep[x]) l=md;
		else r=md;
	}
	return l;
}
bool ED;
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,t1,t2;i<n;++i){
		scanf("%d%d",&t1,&t2);
		g[t1].pb(t2),g[t2].pb(t1);
	}
	scanf("%d",&m);
	
	if(CKL()){
		dfs1(1,0);
		build(1,1,n);
//		cout<<"!!!"<<tr[1].t;return 0;
		for(int i=1;i<=n;++i){
			df[dep[i]]=i;
			rt[i]=upd(rt[i-1],1,n,dep[i]);
		}
//		for(int i=1;i<=n;++i) cout<<df[i]<<' ';
//		puts("");
		while(m--){
			int s,t,k;
			scanf("%d%d%d",&s,&t,&k);
			int l=0,r=t-s+1+1,ps,lp,rp,md;
			while(l+1<r){
				md=(l+r)>>1;
				ps=qry(rt[s-1],rt[t],1,n,md);
				lp=TFL(s,ps);
				rp=TFR(ps,t);
//				printf("!%d %d\n",lp,rp);
				if(rp-lp+1>=k) l=md;
				else r=md;
			}
//			printf("%d\n",l);
			printf("%d\n",dep[qry(rt[s-1],rt[t],1,n,l)]);
		}
		return 0;
	}
	dfs(1,0);
	build(1,1,n);//log log复杂度查询区间LCA,log 复杂度查询区间最小值 
	while(m--){
		int l,r,k,ans=0;
		scanf("%d%d%d",&l,&r,&k);
		for(int i=l;i<=r-k+1;++i){
			ans=max(ans,dep[query(1,i,i+k-1)]);
		}
		printf("%d\n",ans);
	}
	return 0;
}
