#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int M=20;
inline void Rd(int &x,int f=1)
{
	x=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while('0'<=c&&c<='9')x=10*x+c-'0',c=getchar();
	x=x*f;
};
int n,m,MxD;
int L[N],R[N],TOT,B[N<<1];
int D[N],F[M+1][N<<1],Lg[N<<1];
int FL[M+1][N],FR[M+1][N];
inline void Bt()
{
	for(int i=1;i<=TOT;i++)F[0][i]=B[i];
	for(int i=1;i<=n;i++)FL[0][i]=L[i],FR[0][i]=R[i];
	for(int i=1;i<=M;i++)
	{
		for(int j=1;j+(1<<i)-1<=n;j++)
		{
			FL[i][j]=min(FL[i-1][j],FL[i-1][j+(1<<i-1)]);
			FR[i][j]=max(FR[i-1][j],FR[i-1][j+(1<<i-1)]);
		}
		for(int j=1;j+(1<<i)-1<=TOT;j++)
		{
			F[i][j]=min(F[i-1][j],F[i-1][j+(1<<i-1)]);
		}
	}
}
int Cnt,H[N],To[N<<1],Nxt[N<<1];
void Add(int u,int v){To[++Cnt]=v,Nxt[Cnt]=H[u],H[u]=Cnt;}
struct Query{int L,R,K,Id;}Q[N];
inline int GtL(int L,int R)
{
	int k=Lg[R-L+1];
	return min(FL[k][L],FL[k][R-(1<<k)+1]);
}
inline int GtR(int L,int R)
{
	int k=Lg[R-L+1];
	return max(FR[k][L],FR[k][R-(1<<k)+1]);
}
inline int LCA(int l,int r)
{
	int L=GtL(l,r),R=GtR(l,r);
	int k=Lg[R-L+1];
//	cout<<l<<' '<<r<<"->"<<L<<' '<<R<<endl;
	return min(F[k][L],F[k][R-(1<<k)+1]); 
} 
void Dfs(int x,int f)
{
	D[x]=D[f]+1;
	MxD=max(MxD,D[x]);
	L[x]=++TOT,B[TOT]=D[x];
//	cout<<TOT<<' '<<x<<' '<<D[x]<<endl;
	for(int i=H[x];i;i=Nxt[i])
	{
		int v=To[i];
		if(v==f)continue;
		Dfs(v,x);
		B[++TOT]=D[x];
	} 
	R[x]=TOT;
}
int G[M][N];
int T[N],T2[N],T3[N],q,Ans[N];
inline void BtG()
{
	for(int i=1;i<=M;i++)
	{
		for(int j=1;j+(1<<i)-1<=n;j++)
		{
			G[i][j]=max(G[i-1][j],G[i-1][j+(1<<i-1)]);
		}
	}
}
inline int Qry(int L,int R)
{
	int k=Lg[R-L+1];
	return max(G[k][L],G[k][R-(1<<k)+1]);
}
int CCnt=0;
inline void Work(int QL,int QR,int L,int R)
{
	if(QL>QR||L>R)return;
	int K=L+R>>1;
	for(int i=1,j=1;i<=n;i++)
	{
		if(D[i]<K)G[0][i]=0,j=i+1;
		else
		{
			while(j<=i&&LCA(j,i)<K)j++;
			G[0][i]=i-j+1;
		}
	}
	BtG();
	int t1=0,t2=0; 
	for(int i=QL;i<=QR;i++)
	{ 
		if(Qry(Q[T[i]].L,Q[T[i]].R)>=Q[T[i]].K)
		{
			Ans[Q[T[i]].Id]=K;
			T3[++t2]=T[i];
		}
		else T2[++t1]=T[i];
	}
	for(int i=QL;i<=QL+t1-1;i++)T[i]=T2[i-QL+1];
	for(int i=QL+t1;i<=QR;i++)T[i]=T3[i-QL-t1+1];
	Work(QL,QL+t1-1,L,K-1);
	Work(QL+t1,QR,K+1,R);
}
 
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	Rd(n);
	for(int i=2;i<=n*2;i++)Lg[i]=Lg[i>>1]+1;
	for(int i=1,u,v;i<n;i++)
	{
		Rd(u),Rd(v);
		Add(u,v),Add(v,u);
	}	
	Dfs(1,0);
	Bt();
	Rd(m);
	
	for(int i=1;i<=m;i++)
	{
		Rd(Q[i].L),Rd(Q[i].R),Rd(Q[i].K);
		Q[i].L+=Q[i].K-1;
		Q[i].Id=i;
		if(Q[i].R-Q[i].L+1<=300)
		{
			int Mx=0;
			for(int x=Q[i].L;x<=Q[i].R;x++)
			{
				Mx=max(LCA(x-Q[i].K+1,x),Mx);
			}	
			Ans[i]=Mx;
		}
		else T[++q]=i;
	}
	Work(1,q,1,MxD);
	for(int i=1;i<=m;i++)printf("%d\n",Ans[i]);
}
