bool Mst;
#include<bits/stdc++.h>
using namespace std;
using ui=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128;
using u128=__uint128_t;
using pii=pair<int,int>;
constexpr int N=5e5+5;
int n,q;
vector<int> Gr[N];
int eu[N<<1],pos[N],idx,dep[N];
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	eu[pos[x]=++idx]=x;
	for(auto &y:Gr[x])
		if(y!=fa){
			dfs(y,x);
			eu[++idx]=x;
		}
}
int lg[N<<1],Min[20][N],Max[20][N],Lca[20][N<<1];
void initST(){
	lg[1]=0;
	for(int i=2;i<=idx;i++)lg[i]=lg[i>>1]+1;
	for(int i=1;i<=n;i++)
		Min[0][i]=Max[0][i]=pos[i];
	for(int i=1;i<=19;i++)
		for(int j=1;j+(1<<i)-1<=n;j++){
			Min[i][j]=min(Min[i-1][j],Min[i-1][j+(1<<(i-1))]);
			Max[i][j]=max(Max[i-1][j],Max[i-1][j+(1<<(i-1))]);
		}
	for(int i=1;i<=idx;i++)
		Lca[0][i]=dep[eu[i]];
	for(int i=1;i<=19;i++)
		for(int j=1;j+(1<<i)-1<=idx;j++)
			Lca[i][j]=min(Lca[i-1][j],Lca[i-1][j+(1<<(i-1))]);
}
inline int askMin(int l,int r){
	int k=lg[r-l+1];
	return min(Min[k][l],Min[k][r-(1<<k)+1]);
}
inline int askMax(int l,int r){
	int k=lg[r-l+1];
	return max(Max[k][l],Max[k][r-(1<<k)+1]);
}
inline int askLca(int l,int r){
	int k=lg[r-l+1];
	return min(Lca[k][l],Lca[k][r-(1<<k)+1]);
}
struct node{
	int l,r,ans;bool f;
	node(){l=r=ans=f=0;}
	node(int _l,int _r,int _ans,bool _f){l=_l,r=_r,ans=_ans,f=_f;}
	friend inline node operator +(const node &a,const node &b){
		return node(a.l+a.f*b.l,b.r+b.f*a.r,max(max(a.ans,b.ans),a.r+b.l),a.f&&b.f);
	}
};
#define mid ((l+r)>>1)
int tot,rt[N],L[N<<6],R[N<<6];node T[N<<6];
inline int newnode(int q){
	int p=++tot;
	L[p]=L[q],R[p]=R[q],T[p]=T[q];
	return p;
}
void ins(int &p,int q,int x,int l=1,int r=n){
	p=newnode(q);
	if(l==r){
		T[p]=node(1,1,1,1);
		return;
	}
	if(x<=mid)ins(L[p],L[q],x,l,mid);
	else ins(R[p],R[q],x,mid+1,r);
	T[p]=T[L[p]]+T[R[p]];
}
node query(int p,int x,int y,int l=1,int r=n){
	if(!p)return node(0,0,0,0);
	if(x<=l&&r<=y)return T[p];
	if(y<=mid)return query(L[p],x,y,l,mid);
	if(x>mid)return query(R[p],x,y,mid+1,r);
	return query(L[p],x,y,l,mid)+query(R[p],x,y,mid+1,r);
}
int merge(int p,int q,int l=1,int r=n){
	if(!p||!q)return p|q;
	int rt=newnode(0);
	L[rt]=merge(L[p],L[q],l,mid);
	R[rt]=merge(R[p],R[q],mid+1,r);
	T[rt]=T[L[rt]]+T[R[rt]];
	return rt;
}
#undef mid
vector<int> vec[N];
void _dfs(int x,int fa){
	for(auto &y:Gr[x])
		if(y!=fa){
			_dfs(y,x);
			rt[x]=merge(rt[x],rt[y]);
		}
	ins(rt[x],rt[x],x);
}
bool Med;
int main(){
	cerr<<abs(&Mst-&Med)/1048576.0<<'\n';
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		Gr[u].emplace_back(v);
		Gr[v].emplace_back(u);
	}
	dfs(1,0);
	initST();
	for(int i=1;i<=n;i++)vec[dep[i]].emplace_back(i);
	_dfs(1,0);
	cin>>q;
	while(q--){
		int u,v,k;
		cin>>u>>v>>k;
		if(v-u+1-k<=20){
			int ans=0;
			for(int l=u,r=u+k-1;r<=v;l++,r++)
				ans=max(ans,askLca(askMin(l,r),askMax(l,r)));
			cout<<ans<<'\n';
		}
		else{
			int l=1,r=n,mid;
			while(l<r){
				mid=(l+r+1)>>1;
				bool flag=0;
				for(auto &o:vec[mid])
					if(query(rt[o],u,v).ans>=k){
						l=mid;
						flag=1;
					}
				if(!flag)r=mid-1;
			}
			cout<<l<<'\n';
		}
	}
	return 0;
}

