#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
vector<int> t[500005];
int Sz[500005],z[500005],l[500005],ord[500005],dep[500005],dfn;
bool vis[500005];
void dfs1(int c,int f){
	Sz[c]=1,dep[c]=dep[f]+1;
	for(auto i:t[c])
	if(i!=f)dfs1(i,c),Sz[c]+=Sz[i],z[c]=(Sz[z[c]]<Sz[i]?i:z[c]);
}
int la[500005],ne[500005],sz[500005],f[500005],L[500005],R[500005];
int find(int c){
	while(f[c]!=c)c=f[c]=f[f[c]];
	return c;
}
void merge(int x,int y){
	x=find(x),y=find(y);
	if(sz[x]>sz[y])swap(x,y);
	f[x]=y,sz[y]+=sz[x];
	if(L[x]<L[y])L[y]=L[x];
	else R[y]=R[x];
}
void ins(int x){
	vis[x]=1;
	if(vis[x-1]){
		ne[x-1]=x,la[x]=x-1;
		merge(x-1,x);
	}
	if(vis[x+1]){
		ne[x]=x+1,la[x+1]=x;
		merge(x,x+1);
	}
}
struct tg{
	int l,r,s;
}a[1000005];
int top,L0[500005],R0[500005];
bool vvv[500005];
int st[500005],T;
void dfs2(int c,int fa,bool p){
	++dfn,l[c]=dfn,ord[dfn]=c;
	for(auto i:t[c])
	if(i!=fa&&i!=z[c])dfs2(i,c,1);
	if(z[c])dfs2(z[c],c,0);
	ins(c);
	for(int i=l[c];i<l[z[c]];++i)ins(ord[i]);
	int lgx=find(c);
	T=0;
	L0[c]=L[lgx],R0[c]=R[lgx];
	++top,a[top]=(tg){L[lgx],R[lgx],dep[c]};
	vvv[lgx]=1,st[++T]=lgx;
	for(int i=l[c];i<l[z[c]];++i){
		lgx=find(ord[i]);
		if(L[lgx]==L0[ord[i]]&&R[lgx]==R0[ord[i]])continue;
		L0[ord[i]]=L[lgx],R0[ord[i]]=R[lgx];
		if(vvv[lgx])continue;
		++top,a[top]=(tg){L[lgx],R[lgx],dep[c]};
		vvv[lgx]=1,st[++T]=lgx;
	}
	for(int i=1;i<=T;++i)vvv[st[i]]=0;
	if(p){
		for(int i=l[c];i<=dfn;++i){
			vis[ord[i]]=0;
			ne[ord[i]]=la[ord[i]]=ord[i],f[ord[i]]=ord[i];
			L[ord[i]]=R[ord[i]]=ord[i];
			sz[ord[i]]=1;
		}
	}
} 
int q;
struct qwq{
	int l,r,k,num;
}b[500005];
int tr[1000005];
void add(int l,int r,int c,int kr,int s){
	if(r<=kr){
		tr[c]=max(tr[c],s);
		return;
	}
	int mid=(l+r)>>1;
	add(l,mid,mid<<1,kr,s);
	if(kr>mid)add(mid+1,r,mid<<1|1,kr,s);
}
int query(int l,int r,int c,int k){
	if(l==r)return tr[c];
	int mid=(l+r)>>1;
	if(k<=mid)return max(tr[c],query(l,mid,mid<<1,k));
	return max(tr[c],query(mid+1,r,mid<<1|1,k));
}
void a1(int l,int r,int c,int k,int s){
	if(l==r){
		tr[c]=max(tr[c],s);
		return;
	}
	int mid=(l+r)>>1;
	if(k<=mid)a1(l,mid,mid<<1,k,s);
	else a1(mid+1,r,mid<<1|1,k,s);
	tr[c]=max(tr[mid<<1],tr[mid<<1|1]);
}
int q1(int l,int r,int c,int kl,int kr){
	if(l>kr||r<kl)return 0;
	if(l>=kl&&r<=kr)return tr[c];
	int mid=(l+r)>>1;
	return max(q1(l,mid,mid<<1,kl,kr),q1(mid+1,r,mid<<1|1,kl,kr));
}
int out[500005];
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>n;
	la[n+1]=n+1;
	for(int i=1;i<=n;++i)ne[i]=la[i]=f[i]=L[i]=R[i]=i,sz[i]=1;
	for(int i=1,x,y;i<n;++i){
		cin>>x>>y;
		t[x].emplace_back(y),t[y].emplace_back(x);
	}
	cin>>q;
	for(int i=1;i<=q;++i)
		cin>>b[i].l>>b[i].r>>b[i].k,b[i].num=i; 
	dfs1(1,1);
	dfs2(1,1,0);
	sort(a+1,a+1+top,[](tg a,tg b){
		return a.l<b.l;
	});
	sort(b+1,b+1+q,[](qwq a,qwq b){
		return a.l<b.l;
	});
	for(int i=1,j=1;i<=q;++i){
		while(j<=top&&a[j].l<=b[i].l)add(1,n,1,a[j].r,a[j].s),++j;
		out[b[i].num]=query(1,n,1,b[i].l+b[i].k-1);
	}
	sort(a+1,a+1+top,[](tg a,tg b){
		return a.r-a.l>b.r-b.l;
	});
	sort(b+1,b+1+q,[](qwq a,qwq b){
		return a.k>b.k;
	});
	memset(tr,0,sizeof(tr));
	for(int i=1,j=1;i<=q;++i){
		while(j<=top&&a[j].r-a[j].l+1>=b[i].k)a1(1,n,1,a[j].l,a[j].s),++j;
		out[b[i].num]=max(out[b[i].num],q1(1,n,1,b[i].l,b[i].r-b[i].k+1));
	}
	for(int i=1;i<=q;++i)
		cout<<out[i]<<'\n';
	return 0;
}
