#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
vector<int> t[500005];
int Sz[500005],z[500005],l[500005],ord[500005],dep[500005],dfn;
bool vis[500005];
void dfs1(int c,int f){
Sz[c]=1,dep[c]=dep[f]+1;
for(auto i:t[c])
if(i!=f)dfs1(i,c),Sz[c]+=Sz[i],z[c]=(Sz[z[c]]<Sz[i]?i:z[c]);
}
int la[500005],ne[500005],sz[500005],f[500005],L[500005],R[500005];
int find(int c){
while(f[c]!=c)c=f[c]=f[f[c]];
return c;
}
void merge(int x,int y){
x=find(x),y=find(y);
if(sz[x]>sz[y])swap(x,y);
f[x]=y,sz[y]+=sz[x];
if(L[x]<L[y])L[y]=L[x];
else R[y]=R[x];
}
void ins(int x){
vis[x]=1;
if(vis[x-1]){
ne[x-1]=x,la[x]=x-1;
merge(x-1,x);
}
if(vis[x+1]){
ne[x]=x+1,la[x+1]=x;
merge(x,x+1);
}
}
struct tg{
int l,r,s;
}a[1000005];
int top,L0[500005],R0[500005];
bool vvv[500005];
int st[500005],T;
void dfs2(int c,int fa,bool p){
++dfn,l[c]=dfn,ord[dfn]=c;
for(auto i:t[c])
if(i!=fa&&i!=z[c])dfs2(i,c,1);
if(z[c])dfs2(z[c],c,0);
ins(c);
for(int i=l[c];i<l[z[c]];++i)ins(ord[i]);
int lgx=find(c);
T=0;
L0[c]=L[lgx],R0[c]=R[lgx];
++top,a[top]=(tg){L[lgx],R[lgx],dep[c]};
vvv[lgx]=1,st[++T]=lgx;
for(int i=l[c];i<l[z[c]];++i){
lgx=find(ord[i]);
if(L[lgx]==L0[ord[i]]&&R[lgx]==R0[ord[i]])continue;
L0[ord[i]]=L[lgx],R0[ord[i]]=R[lgx];
if(vvv[lgx])continue;
++top,a[top]=(tg){L[lgx],R[lgx],dep[c]};
vvv[lgx]=1,st[++T]=lgx;
}
for(int i=1;i<=T;++i)vvv[st[i]]=0;
if(p){
for(int i=l[c];i<=dfn;++i){
vis[ord[i]]=0;
ne[ord[i]]=la[ord[i]]=ord[i],f[ord[i]]=ord[i];
L[ord[i]]=R[ord[i]]=ord[i];
sz[ord[i]]=1;
}
}
}
int q;
struct qwq{
int l,r,k,num;
}b[500005];
int tr[1000005];
void add(int l,int r,int c,int kr,int s){
if(r<=kr){
tr[c]=max(tr[c],s);
return;
}
int mid=(l+r)>>1;
add(l,mid,mid<<1,kr,s);
if(kr>mid)add(mid+1,r,mid<<1|1,kr,s);
}
int query(int l,int r,int c,int k){
if(l==r)return tr[c];
int mid=(l+r)>>1;
if(k<=mid)return max(tr[c],query(l,mid,mid<<1,k));
return max(tr[c],query(mid+1,r,mid<<1|1,k));
}
void a1(int l,int r,int c,int k,int s){
if(l==r){
tr[c]=max(tr[c],s);
return;
}
int mid=(l+r)>>1;
if(k<=mid)a1(l,mid,mid<<1,k,s);
else a1(mid+1,r,mid<<1|1,k,s);
tr[c]=max(tr[mid<<1],tr[mid<<1|1]);
}
int q1(int l,int r,int c,int kl,int kr){
if(l>kr||r<kl)return 0;
if(l>=kl&&r<=kr)return tr[c];
int mid=(l+r)>>1;
return max(q1(l,mid,mid<<1,kl,kr),q1(mid+1,r,mid<<1|1,kl,kr));
}
int out[500005];
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
la[n+1]=n+1;
for(int i=1;i<=n;++i)ne[i]=la[i]=f[i]=L[i]=R[i]=i,sz[i]=1;
for(int i=1,x,y;i<n;++i){
cin>>x>>y;
t[x].emplace_back(y),t[y].emplace_back(x);
}
cin>>q;
for(int i=1;i<=q;++i)
cin>>b[i].l>>b[i].r>>b[i].k,b[i].num=i;
dfs1(1,1);
dfs2(1,1,0);
sort(a+1,a+1+top,[](tg a,tg b){
return a.l<b.l;
});
sort(b+1,b+1+q,[](qwq a,qwq b){
return a.l<b.l;
});
for(int i=1,j=1;i<=q;++i){
while(j<=top&&a[j].l<=b[i].l)add(1,n,1,a[j].r,a[j].s),++j;
out[b[i].num]=query(1,n,1,b[i].l+b[i].k-1);
}
sort(a+1,a+1+top,[](tg a,tg b){
return a.r-a.l>b.r-b.l;
});
sort(b+1,b+1+q,[](qwq a,qwq b){
return a.k>b.k;
});
memset(tr,0,sizeof(tr));
for(int i=1,j=1;i<=q;++i){
while(j<=top&&a[j].r-a[j].l+1>=b[i].k)a1(1,n,1,a[j].l,a[j].s),++j;
out[b[i].num]=max(out[b[i].num],q1(1,n,1,b[i].l,b[i].r-b[i].k+1));
}
for(int i=1;i<=q;++i)
cout<<out[i]<<'\n';
return 0;
}