#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
struct{
int nxt,v;
}edge[maxn<<1];
int head[maxn],ec;
void addedge(int u,int v){edge[++ec]={head[u],v};head[u]=ec;}
struct node{mutable int l,r;};
bool operator<(node a,node b){return a.l<b.l;}
struct deplr{
int dep,l,r;
}t[maxn<<1],t_t[maxn<<1];
struct{
int l,r,k,i;
}q[maxn],t_p[maxn];
int tc;
#define lb(i) (i&-i)
int bit[maxn];
void upd(int i,int v){
for(;i<maxn;i+=lb(i))bit[i]=max(bit[i],v);
}
int qmax(int i){
int ans=0;
for(;i;i^=lb(i))ans=max(ans,bit[i]);
return ans;
}
void reset(int i){for(;i<maxn;i+=lb(i))bit[i]=0;}
void mer(set<node>&a,set<node>&b,int dep){
if(a.size()<b.size())swap(a,b);
for(node cur:b){
int l=cur.l,r=cur.r;
auto q=a.insert(cur).first;
auto p=q++;
if(q!=a.end()&&q->l==r+1)p=a.erase(p),q->l=l,t[++tc]={dep,q->l,q->r};
if(p!=a.begin()&&(--p)->r==l-1)l=p->l,p=a.erase(p),p->l=l,t[++tc]={dep,p->l,p->r};
}
}
set<node>se[maxn];
void dfs(int u,int fa,int dep){
se[u]={{u,u}};t[++tc]={dep,u,u};
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].v;if(v==fa)continue;
dfs(v,u,dep+1);
mer(se[u],se[v],dep);
}
}
int Q,n,ans[maxn];
void sol(int l,int r,int ql,int qr,int vl,int vr){
if(vl == vr){
for(int i=ql;i<=qr;++i)ans[q[i].i]=vl;
return;
}
int md=(vl+vr+1)>>1;
int j=l,rttp=0,lttp=l;
int lptp=ql,rptp=0;
for(int i=ql;i<=qr;++i){
while(j<=r && t[j].r-t[j].l+1>=q[i].k){
if(t[j].dep>=md){
upd(t[j].l,t[j].r);
t[lttp++]=t[j++];
}else{
t_t[rttp++]=t[j++];
}
}
if(qmax(q[i].r-q[i].k+1) >= q[i].l+q[i].k-1){
q[lptp++]=q[i];
}else{
t_p[rptp++]=q[i];
}
}
for(int p=j;p<=r;++p)
if(t[p].dep>=md)t[lttp++]=t[p];
else t_t[rttp++]=t[p];
memcpy(t+lttp,t_t,rttp*sizeof t[0]);
memcpy(q+lptp,t_p,rptp*sizeof q[0]);
for(int p=l;p<j;++p)if(t[p].dep>=md)reset(t[p].l);
sol(l,lttp-1,ql,lptp-1,md,vr);
sol(lttp,r,lptp,qr,vl,md-1);
}
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,u,v;i<n;++i)cin>>u>>v,addedge(u,v),addedge(v,u);
dfs(1,0,1);
cin>>Q;
for(int i=1;i<=Q;++i){
int l,r,k;cin>>l>>r>>k;
q[i]={l,r,k,i};
}
sort(t+1,t+tc+1,[](auto a,auto b){return a.r-a.l>b.r-b.l;});
sort(q+1,q+Q+1,[](auto a,auto b){return a.k>b.k;});
sol(1,tc,1,Q,1,n);
for(int i=1;i<=Q;++i)cout<<ans[i]<<'\n';
}