#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
vector<int>to[N];
int fa[N],dep[N],dfn[N],st[20][N],id[N],T;
void dfs(int u,int f)
{
id[dfn[u]=++T]=u;
st[0][T]=dfn[f];
fa[u]=f;dep[u]=dep[f]+1;
for(int v:to[u])if(v!=f)dfs(v,u);
}
int h[N],n,p[N];
int via[N],_L[N],_R[N];
int get(int x){return x==fa[x]?x:fa[x]=get(fa[x]);}
void merge(int x,int y)
{
x=get(x),y=get(y);fa[x]=y;
_L[y]=min(_L[y],_L[x]),_R[y]=max(_R[y],_R[x]);
}
struct node
{
int l,r,v;
};
struct mes
{
int l,r,k,i;
}Q[N];
int ans[N];
namespace SGT
{
int mx[N<<2];
void mdf(int p,int l,int r,int k,int v)
{
mx[p]=max(mx[p],v);
if(l==r)return;
int mid=l+r>>1;
if(k<=mid)mdf(p<<1,l,mid,k,v);
else mdf(p<<1|1,mid+1,r,k,v);
}
int qry(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return mx[p];
int mid=l+r>>1;
if(R<=mid)return qry(p<<1,l,mid,L,R);
if(L> mid)return qry(p<<1|1,mid+1,r,L,R);
return max(qry(p<<1,l,mid,L,R),qry(p<<1|1,mid+1,r,L,R));
}
}
vector<array<int,3>>op[N];
inline int LCA(int x,int y)
{
if(x==y)return x;
if((x=dfn[x])>(y=dfn[y]))swap(x,y);
int d=__lg(y-x++);
return id[min(st[d][x],st[d][y-(1<<d)+1])];
}
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
cin.tie(0)->sync_with_stdio(0);
cin>>n;
for(int i=1,u,v;i<n;++i)cin>>u>>v,to[u].push_back(v),to[v].push_back(u);
dfs(1,0);
for(int i=1;i<=__lg(n);++i)
for(int j=1;j+(1<<i)-1<=n;++j)
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
for(int i=1;i<n;++i)
{
h[i]=dep[LCA(i,i+1)];
p[i]=i;
}
sort(p+1,p+n,[&](int x,int y){return h[x]>h[y];});
for(int i=1;i<=n;++i)fa[i]=_L[i]=_R[i]=i;
vector<node>z;
for(int _=1;_<n;++_)
{
int i=p[_];
merge(i,i+1);
z.push_back({_L[get(i)],_R[get(i)],h[i]});
}
for(int i=1;i<=n;++i)z.push_back({i,i,dep[i]});
int q;cin>>q;
for(int i=1;i<=q;++i)
{
cin>>Q[i].l>>Q[i].r>>Q[i].k;
Q[i].i=i;
}
sort(Q+1,Q+q+1,[&](const mes&a,const mes&b){return a.k>b.k;});
sort(z.begin(),z.end(),[&](const node&x,const node&y){return x.r-x.l>y.r-y.l;});
for(int i=1,p=0;i<=q;++i)
{
while(p<z.size()&&z[p].r-z[p].l+1>=Q[i].k)
{
SGT::mdf(1,1,n,z[p].l,z[p].v);
++p;
}
ans[Q[i].i]=SGT::qry(1,1,n,Q[i].l,Q[i].r-Q[i].k+1);
}
sort(Q+1,Q+q+1,[&](const mes&a,const mes&b){return a.l<b.l;});
sort(z.begin(),z.end(),[&](const node&x,const node&y){return x.l<y.l;});
for(auto k:z)op[k.l].push_back({1,k.r,k.v}),op[k.r+1].push_back({0,k.r,k.v});
memset(SGT::mx,0,sizeof SGT::mx);
for(int i=1,p=1;i<=q;++i)
{
while(p<z.size()&&z[p].l<=Q[i].l)
{
SGT::mdf(1,1,n,z[p].r,z[p].v);
++p;
}
ans[Q[i].i]=max(ans[Q[i].i],SGT::qry(1,1,n,Q[i].l+Q[i].k-1,n));
}
for(int i=1;i<=q;++i)cout<<ans[i]<<"\n";
return 0;
}