#include<bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
const int N=5e5+5;
int n,q;
vector<int> g[N];
int dfn[N],dep[N],bk[N],ft[N],tim;
void dfs(int u,int fa){
	dfn[u]=++tim;dep[u]=dep[fa]+1;
	bk[tim]=u;
	ft[u]=fa;
	for(int v:g[u]){
		if(v==fa) continue;
		dfs(v,u);
	}
}
int f1[N][22],f2[N][22],f3[N][22];
int gett(int x,int y){
	if(dep[x]<dep[y]) return x;
	return y;
}
int lg[N];
void pre1(){
	for(int i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	for(int i=1;i<=n;i++)
		f1[i][0]=bk[i];
	for(int i=1;i<=20;i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			f1[j][i]=gett(f1[j][i-1],f1[j+(1<<(i-1))][i-1]);
}
int query1(int l,int r){
	if(l==r) return l;
	int kl=dfn[l],kr=dfn[r];
	if(kl>kr) swap(kl,kr);
	kl++;
	int e=lg[kr-kl+1];
	return ft[gett(f1[kl][e],f1[kr-(1<<e)+1][e])];
}
void pre2(){
	for(int i=1;i<=n;i++)
		f2[i][0]=i;
	for(int i=1;i<=20;i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
			f2[j][i]=query1(f2[j][i-1],f2[j+(1<<(i-1))][i-1]);
}
int query2(int l,int r){
	int e=lg[r-l+1];
	return query1(f2[l][e],f2[r-(1<<e)+1][e]);
}
int T[N];
struct tree{
	int sum[N*20],ls[N*20],rs[N*20],cnt=0;
	int build(int l,int r){
		int tot=++cnt;
		if(l==r)
			return tot;
		int mid=(l+r)>>1;
		ls[tot]=build(l,mid);
		rs[tot]=build(mid+1,r);
		return tot;
	}
	int update(int pre,int l,int r,int pos){
		int tot=++cnt;
		sum[tot]=sum[pre]+1;ls[tot]=ls[pre];rs[tot]=rs[pre];
		if(l==r && pos==l) return tot;
		int mid=(l+r)>>1;
		if(pos<=mid) ls[tot]=update(ls[pre],l,mid,pos);
		else rs[tot]=update(rs[pre],mid+1,r,pos);
		return tot;
	}
	int query(int now,int pre,int l,int r,int k){
		int s=sum[ls[now]]-sum[ls[pre]];
		if(l==r) return l;
		int mid=(l+r)>>1;
		if(s>=k) return query(ls[now],ls[pre],l,mid,k);
		else return query(rs[now],rs[pre],mid+1,r,k-s);
	}
}tr;
void solveA(){
	T[0]=tr.build(1,n);
	for(int i=1;i<=n;i++)
		T[i]=tr.update(T[i-1],1,n,dfn[i]);
	cin>>q;
	for(int i=1;i<=q;i++){
		int l,r,k;
		cin>>l>>r>>k;
		cout<<tr.query(T[r],T[l-1],1,n,(r-l+1)-k+1)<<"\n";
	}
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	int u,v;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		g[u].pb(v);
		g[v].pb(u);
	}
	int siz1=0,siz2=0;
	dfs(1,0);
	for(int i=1;i<=n;i++){
		if(g[i].size()==1) siz1++;
		if(g[i].size()==2) siz2++;
	}
	if(g[1].size()==1 && siz1==2 && siz2==n-2) {solveA();return 0;}
	pre1();
	pre2();
	cin>>q;
	for(int i=1;i<=q;i++){
		int l,r,k;
		cin>>l>>r>>k;
		int maxx=0;
		for(int j=l;j<=r-k+1;j++){
			int x=query2(j,j+k-1);
			if(maxx<dep[x]) maxx=dep[x];
			//cout<<j<<" "<<j+k-1<<" "<<x<<"\n";
		}
		cout<<maxx<<"\n";
	}
	return 0;
}  
