#include<bits/stdc++.h>
using namespace std;
const int MAXN=5e5+5;
inline void chkmax(int &x,const int &y) { x=y>x?y:x; }
int n,q,dep[MAXN],dfn[MAXN],dcnt,st[20][MAXN];
vector <int> G[MAXN];
void dfs(int u,int fz) {
	dfn[u]=++dcnt,st[0][dcnt]=fz,dep[u]=dep[fz]+1;
	for(int v:G[u]) if(v^fz) dfs(v,u);
}
int bit(int x) { return 1<<x; }
int cmp(int x,int y) { return dfn[x]<dfn[y]?x:y; }
int LCA(int x,int y) {
	if(x==y) return x;
	int l=min(dfn[x],dfn[y])+1,r=max(dfn[x],dfn[y]),k=__lg(r-l+1);
	return cmp(st[k][l],st[k][r-bit(k)+1]);
}
int mx[20][MAXN];
int qmx(int l,int r) {
	int k=__lg(r-l+1);
	return max(mx[k][l],mx[k][r-bit(k)+1]);
}
int w[MAXN],lp[MAXN],rp[MAXN],ord[MAXN];
struct info {
	int l,r,k,id;
}	a[MAXN],qy[MAXN];
int ans[MAXN];
struct ZkwSegt {
	static const int N=1<<19;
	int tr[N<<1];
	void upd(int x,int v) {
		for(x+=N;x;x>>=1) chkmax(tr[x],v);
	}
	int qry(int l,int r) {
		int s=0;
		for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1) {
			if(~l&1) chkmax(s,tr[l^1]);
			if(r&1) chkmax(s,tr[r^1]);
		}
		return s;
	}
}	TL,TR;
struct FenwickTree {
	int tr[MAXN];
	void upd(int x,int v) { for(;x;x&=x-1) chkmax(tr[x],v); }
	int qry(int x) {
		int s=0;
		for(;x<=n;x+=x&-x) chkmax(s,tr[x]);
		return s;
	}
}	TU;
signed main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1,u,v;i<n;++i) {
		cin>>u>>v,G[u].push_back(v),G[v].push_back(u);
	}
	dfs(1,0);
	for(int i=1;i<=n;++i) mx[0][i]=dep[i];
	for(int k=1;k<20;++k) {
		int *f=st[k],*f0=st[k-1];
		int *g=mx[k],*g0=mx[k-1];
		for(int i=1;i+bit(k)-1<=n;++i) {
			f[i]=cmp(f0[i],f0[i+bit(k-1)]);
			g[i]=max(g0[i],g0[i+bit(k-1)]);
		}
	}
	for(int i=1;i<=n;++i) lp[i]=rp[i]=i;
	for(int i=2;i<=n;++i) w[i]=dep[LCA(i-1,i)],ord[i-1]=i;
	sort(ord+1,ord+n,[&](int i,int j){ return w[i]>w[j]; });
	for(int i=1;i<n;++i) {
		int x=ord[i],l=lp[x-1],r=rp[x];
		a[i]={l,r,w[x],0},rp[l]=r,lp[r]=l;
	}
	int m=0;
	cin>>q;
	for(int i=1,l,r,k;i<=q;++i) {
		cin>>l>>r>>k,--k;
		if(!k) ans[i]=qmx(l,r);
		else qy[++m]={l,r,k,i};
	}
	sort(a+1,a+n,[&](auto x,auto y){ return x.r-x.l>y.r-y.l; });
	sort(qy+1,qy+m+1,[&](auto x,auto y){ return x.k>y.k; });
	for(int i=n,p1=1,p2=1;~i;--i) {
		for(;p1<n&&a[p1].r-a[p1].l>=i;++p1) {
			TL.upd(a[p1].l,a[p1].k);
			TR.upd(a[p1].r,a[p1].k);
		}
		for(;p2<=m&&qy[p2].k>=i;++p2) {
			info &o=qy[p2];
			chkmax(ans[o.id],TL.qry(o.l,o.r-o.k));
			chkmax(ans[o.id],TR.qry(o.l+o.k,o.r));
		}
	}
	sort(a+1,a+n,[&](auto x,auto y){ return x.l<y.l; });
	sort(qy+1,qy+m+1,[&](auto x,auto y){ return x.l<y.l; });
	for(int i=1,p1=1,p2=1;i<=n;++i) {
		for(;p1<n&&a[p1].l<=i;++p1) TU.upd(a[p1].r,a[p1].k);
		for(;p2<=m&&qy[p2].l<=i;++p2) {
			info &o=qy[p2];
			chkmax(ans[o.id],TU.qry(o.r));
		}
	}
	for(int i=1;i<=q;++i) cout<<ans[i]<<"\n";
	return 0;
}
