#include<bits/stdc++.h>
using namespace std;
int n,q;
vector<int> to[500005];
int hs[500005];
int sz[500005];
int dep[500005];
int dfn[500005];
int tim=0;
int rep[500005];
void dfs1(int x,int fa){
dep[x]=dep[fa]+1;
sz[x]=1;
dfn[x]=++tim;rep[tim]=x;
for(auto v:to[x]){
if(v==fa)continue;
dfs1(v,x);sz[x]+=sz[v];
if(sz[v]>sz[hs[x]])hs[x]=v;
}
return ;
}
int nxt[500005];
int pre[500005];
struct nd{
int l,r,id;
};
vector<nd> w1[500005],w2[500005];
int oped[2000005];
int ptr=0;
void ad(int x,int bel){
int l=pre[x]+1;
int r=nxt[x]-1;
w1[l].push_back((nd){l,r,bel});
w2[r-l+1].push_back((nd){l,r,bel});
nxt[pre[x]]=nxt[x];
pre[nxt[x]]=pre[x];
oped[++ptr]=pre[x];
oped[++ptr]=nxt[x];
return ;
}
void dfs2(int x,int fa,bool isheavy){
for(auto v:to[x]){
if(v==fa or v==hs[x])continue;
dfs2(v,x,0);
}
if(hs[x])dfs2(hs[x],x,1);
for(auto v:to[x]){
if(v==fa or v==hs[x])continue;
for(int i=dfn[v];i<=dfn[v]+sz[v]-1;i++)ad(rep[i],x);
}
ad(x,x);
if(!isheavy){
for(int i=1;i<=ptr;i++){
nxt[oped[i]]=oped[i]+1;
pre[oped[i]]=oped[i]-1;
}
ptr=0;
}
return ;
}
int ans[500005];
vector<nd> Q1[500005],Q2[500005];
int mx[5000005];
int d;
void build(int l,int r,int x){
mx[x]=0;
if(l==r)return ;
int mid=(l+r)>>1;
build(l,mid,x*2);build(mid+1,r,x*2+1);
return ;
}
void M(int x,int v){
x=d-1+x;
mx[x]=max(mx[x],v);
x>>=1;
while(x){
mx[x]=max(mx[x<<1],mx[x<<1|1]);
x>>=1;
}
return ;
}
int Q(int L,int R){
L=d-1+L;R=d-1+R;
if(L==R)return mx[L];
int lca=L^R;
int z=31^__builtin_clz(lca);
lca=L>>(z+1);
int ret=max(mx[L],mx[R]);
while(L!=(lca<<1)){
if(!(L&1))ret=max(ret,mx[L+1]);
L>>=1;
}
while(R!=(lca<<1|1)){
if(R&1)ret=max(ret,mx[R-1]);
R>>=1;
}
return ret;
}
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
to[u].push_back(v);
to[v].push_back(u);
}
dfs1(1,0);
for(int i=1;i<=n+1;i++)pre[i]=i-1;
for(int i=0;i<=n;i++)nxt[i]=i+1;
dfs2(1,0,0);
cin>>q;
for(int i=1;i<=q;i++){
int l,r,k;cin>>l>>r>>k;
Q1[l].push_back((nd){r,k,i});
Q2[k].push_back((nd){l,r,i});
}
d=1;
while(d<n)d<<=1;
for(int i=1;i<=n;i++){
for(auto v:w1[i]){
M(v.r,dep[v.id]);
}
for(auto v:Q1[i]){
if(v.id==1){
int rp=1;
}
ans[v.id]=max(ans[v.id],Q(i+v.r-1,n));
}
}
for(int i=1;i<=2*d-1;i++)mx[i]=0;
for(int i=n;i>=1;i--){
for(auto v:w2[i]){
M(v.l,dep[v.id]);
}
for(auto v:Q2[i]){
ans[v.id]=max(ans[v.id],Q(v.l,v.r-i+1));
}
}
for(int i=1;i<=q;i++)cout<<ans[i]<<'\n';
return 0;
}