#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch&15);
	return f*x;
}
int n,q,dep[500005],pos[500005],u,v,lc[5005][5005],la[500005][21],dp[500005],f[500005][21];
vector<int> g[500005];
bool flga=1;
struct seg{
	int mx,pre,suf,len;
	friend seg operator +(seg x,seg y){
		seg z;
		z.len=x.len+y.len;
		z.mx=max(x.mx,max(y.mx,x.suf+y.pre));
		z.pre=(x.mx==x.len?x.len+y.pre:x.pre);
		z.suf=(y.mx==y.len?y.len+x.suf:y.suf);
		return z;
	}
}tr[1000005];
struct qry{
	int l,r,k,id;
}qr[500005],q1[500005],q2[500005];
inline int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) x=f[x][__lg(dep[x]-dep[y])];
	if(x==y) return x;
	for(int i=__lg(dep[x]);~i;i--)
		if(f[x][i]^f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
void dfs(int x,int fa){
	dep[x]=dep[fa]+1,f[x][0]=fa,pos[dep[x]]=x;
	for(int i=1;(1<<i)<=dep[x];i++)	
		f[x][i]=f[f[x][i-1]][i-1];
	for(int y:g[x])
		if(y^fa)
			dfs(y,x);
}
int query(int l,int r){
	int k=__lg(r-l+1);
	return lc[la[l][k]][la[r-(1<<k)+1][k]];
}
int query2(int l,int r){
	int k=__lg(r-l+1);
	return lca(la[l][k],la[r-(1<<k)+1][k]);
}
void upd(int p,int l,int r,int x,int val){
	if(l==r){
		tr[p]={val,val,val,1};
		return ;
	}
	int mid=l+r>>1;
	if(x<=mid) upd(mid<<1,l,mid,x,val);
	else upd(mid<<1|1,mid+1,r,x,val);
	tr[p]=tr[mid<<1]+tr[mid<<1|1];
}
seg quy(int p,int l,int r,int lt,int rt){
	if(lt<=l&&r<=rt) return tr[p];
	int mid=l+r>>1;
	if(rt<=mid) return quy(mid<<1,l,mid,lt,rt);
	if(lt>mid) return quy(mid<<1|1,mid+1,r,lt,rt);
	return quy(mid<<1,l,mid,lt,rt)+quy(mid<<1|1,mid+1,r,lt,rt);
}
void build(int p,int l,int r){
	tr[p].len=r-l+1;
	if(l==r) return ;
	int mid=l+r>>1;
	build(mid<<1,l,mid);
	build(mid<<1|1,mid+1,r); 
}
void solve(int l,int r,int lt,int rt){
	if(lt>rt) return ;
	if(l==r){
		for(int i=lt;i<=rt;i++)
			dp[qr[i].id]=l;
		return ;
	}
	int mid=l+r>>1,cnt1=0,cnt2=0;
	for(int i=mid+1;i<=r;i++) upd(1,1,n,pos[i],1);
	for(int i=lt;i<=rt;i++)
		if(quy(1,1,n,qr[i].l,qr[i].r).mx>=qr[i].k) q2[++cnt2]=qr[i];
		else q1[++cnt1]=qr[i];
//	cout<<l<<' '<<r<<' '<<cnt1<<' '<<cnt2<<'\n';
	int cnt3=lt-1;
	for(int i=1;i<=cnt1;i++) qr[++cnt3]=q1[i];
	for(int i=1;i<=cnt2;i++) qr[++cnt3]=q2[i];
	solve(l,mid,lt,lt+cnt1-1);
//	cout<<l<<' '<<r<<' '<<cnt1<<' '<<cnt2<<'\n';
	for(int i=mid+1;i<=r;i++) upd(1,1,n,pos[i],0);
	solve(mid+1,r,lt+cnt1,rt);
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for(int i=1;i<n;i++)
		u=read(),v=read(),g[u].push_back(v),g[v].push_back(u);
	q=read();
	dfs(1,0);
	for(int i=1;i<=n;i++)
		if(!pos[i]) 
			flga=0;
	if(flga){
		build(1,1,n);
//		for(int i=1;i<=n;i++) cout<<pos[i]<<'\n';
		for(int i=1;i<=q;i++) qr[i].l=read(),qr[i].id=i,qr[i].r=read(),qr[i].k=read();
		solve(1,n,1,q);
		for(int i=1;i<=q;i++) printf("%d\n",dp[i]);
		return 0;
 	}
	if(n<=5000&&q<=5000){
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(j<i) lc[i][j]=lc[j][i];
				else lc[i][j]=lca(i,j);
		for(int i=1;i<=n;i++) la[i][0]=i;
		for(int j=1;(1<<j)<=n;j++)
			for(int i=1;i+(1<<j)-1<=n;i++)
				la[i][j]=lc[la[i][j-1]][la[i+(1<<j-1)][j-1]];
		for(int l,r,k;q--;){
			l=read(),r=read(),k=read();
			int ans=1;
			for(int i=l;i+k-1<=r;i++) ans=max(ans,dep[query(i,i+k-1)]);
			printf("%d\n",ans);
		}
		return 0;
	}
	for(int i=1;i<=n;i++) la[i][0]=i;
	for(int j=1;(1<<j)<=n;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)
			la[i][j]=lca(la[i][j-1],la[i+(1<<j-1)][j-1]);
	for(int l,r,k;q--;){
		l=read(),r=read(),k=read();
		printf("%d\n",dep[query2(l,r)]);
	}
	return 0;
}
/*
5
1 2
2 3
3 4
4 5
3
1 3 1
3 5 2
1 5 4
100+100+100+[48,64]
*/
