#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;
}