#include<bits/stdc++.h>
using namespace std;
const int NR=5e5+10;
int n,q,dep[NR],fa[NR],son[NR],siz[NR],top[NR],tot,ans[NR];
vector<int>g[NR],buc[NR];
#define pb emplace_back
struct task{
int id,x,y,z,v;
}t[NR<<2];
void dfs1(int id,int fath){
siz[id]=1;dep[id]=dep[fath]+1;fa[id]=fath;
for(int x:g[id])
if(x!=fath){
dfs1(x,id);
if(siz[son[id]]<siz[x])son[id]=x;
siz[id]+=siz[x];
}
}
void dfs2(int id,int fath,int k){
top[id]=k;
if(son[id])dfs2(son[id],id,k);
for(int x:g[id])
if(x!=fath&&x!=son[id])dfs2(x,id,x);
}
int LCA(int x,int y){
while(top[x]!=top[y]){
while(top[x]!=top[y]&&dep[top[x]]>=dep[top[y]])x=fa[top[x]];
while(top[x]!=top[y]&&dep[top[y]]>=dep[top[x]])y=fa[top[y]];
}
if(dep[x]<=dep[y])return x;
return y;
}
int rt[NR],ptot,ch[NR*20][2],sum[NR*20];
#define lson ch[id][0]
#define rson ch[id][1]
#define mid ((l+r)>>1)
void add(int &id,int l,int r,int pos){
if(!id)id=++ptot;
sum[id]++;
if(l==r)return;
if(pos<=mid)add(lson,l,mid,pos);
else add(rson,mid+1,r,pos);
}
int merge(int x,int y){
if(!x||!y)return x|y;
sum[x]+=sum[y];
ch[x][0]=merge(ch[x][0],ch[y][0]);
ch[x][1]=merge(ch[x][1],ch[y][1]);
return x;
}
int query(int id,int l,int r,int L,int R){
if(!id||r<L||R<l)return 0;
if(L<=l&&r<=R)return sum[id];
return query(lson,l,mid,L,R)+query(rson,mid+1,r,L,R);
}
int query1(int id,int l,int r,int k){
if(!id)return r+1-k;
if(r-l+1-sum[id]<k)return l-1;
int rsize=r-mid-sum[rson];
if(k<=rsize)return query1(rson,mid+1,r,k);
return query1(lson,l,mid,k-rsize);
}
int query2(int id,int l,int r,int k){
if(!id)return l-1+k;
if(r-l+1-sum[id]<k)return r+1;
int lsize=mid+1-l-sum[lson];
if(k<=lsize)return query2(lson,l,mid,k);
return query2(rson,mid+1,r,k-lsize);
}
void dfs(int id,int fath){
add(rt[id],1,n,id);
t[++tot]=task{0,id,n+1-id,1,dep[id]};
for(int x:g[id])
if(x!=fath)dfs(x,id),rt[id]=merge(rt[id],rt[x]);
int lst=0;
for(int x:buc[id]){
if(x<=lst)continue;
int cntl=x-query(rt[id],1,n,1,x),cntr=(n-x)-query(rt[id],1,n,x+1,n);
int l=query1(rt[id],1,n,cntr+1)+1,r=query2(rt[id],1,n,cntl+1)-1;
t[++tot]=task{0,l,n+1-r,r-l+1,dep[id]};lst=r;
}
}
int c[NR];
void chkmax(int &x,int y){x=(x>y)?x:y;}
int lowbit(int x){
return x&(-x);
}
void add(int x,int y){
for(;x<=n;x+=lowbit(x))chkmax(c[x],y);
}
int ask(int x){
int res=0;
for(;x;x^=lowbit(x))chkmax(res,c[x]);
return res;
}
void clear(int x){
for(;x<=n;x+=lowbit(x))c[x]=0;
}
bool cmp1(task r1,task r2){
if(r1.x!=r2.x)return r1.x<r2.x;
if(r1.y!=r2.y)return r1.y<r2.y;
return r1.id<r2.id;
}
bool cmp2(task r1,task r2){
if(r1.y!=r2.y)return r1.y<r2.y;
return r1.id<r2.id;
}
task tmp1[NR<<2],tmp2[NR<<2];
void CDQ(int l,int r){
if(l==r)return;
CDQ(l,mid);CDQ(mid+1,r);
int now=mid+1,pos=mid;
for(int i=l;i<=mid;i++){
while(now<=r&&t[now].y<t[i].y){
if(t[now].id)chkmax(ans[t[now].id],ask(n+1-t[now].z));
now++;
}
if(now>r){
pos=i-1;
break;
}
if(!t[i].id)add(n+1-t[i].z,t[i].v);
}
while(now<=r){
if(t[now].id)chkmax(ans[t[now].id],ask(n+1-t[now].z));
now++;
}
for(int i=l;i<=pos;i++)
if(!t[i].id)clear(n+1-t[i].z);
int len1=mid+1-l,len2=r-mid,j=1;now=l-1;
for(int i=l;i<=mid;i++)tmp1[i-l+1]=t[i];
for(int i=mid+1;i<=r;i++)tmp2[i-mid]=t[i];
for(int i=1;i<=len1;i++){
while(j<=len2&&cmp2(tmp2[j],tmp1[i]))t[++now]=tmp2[j],j++;
t[++now]=tmp1[i];
}
for(;j<=len2;j++)t[++now]=tmp2[j];
}
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1,x,y;i<n;i++)
cin>>x>>y,g[x].pb(y),g[y].pb(x);
cin>>q;
for(int i=1,l,r,k;i<=q;i++)
cin>>l>>r>>k,t[i]=task{i,r-k+1,n+1-(l+k-1),k,0};
tot=q;
dfs1(1,0);dfs2(1,0,1);
for(int i=1;i<n;i++)buc[LCA(i,i+1)].pb(i);
dfs(1,0);
sort(t+1,t+1+tot,cmp1);
CDQ(1,tot);
for(int i=1;i<=q;i++)cout<<ans[i]<<'\n';
return 0;
}