#include<stdio.h>
#include<vector>
#include<algorithm>
#define M 500005
using namespace std;
struct SGT{
#define L (x<<1)
#define R (x<<1|1)
int tr[M<<2];
void clear(int x,int l,int r){
tr[x]=0;
if(l==r) return;
int mid=l+r>>1;
clear(L,l,mid),clear(R,mid+1,r);
}
void upd(int x,int l,int r,int i,int k){
if(l==r) return tr[x]=max(tr[x],k),void();
int mid=l+r>>1;
if(i<=mid) upd(L,l,mid,i,k);
else upd(R,mid+1,r,i,k);
tr[x]=max(tr[L],tr[R]);
}
int que(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tr[x];
int mid=l+r>>1;
if(qr<=mid) return que(L,l,mid,ql,qr);
if(ql>mid) return que(R,mid+1,r,ql,qr);
return max(que(L,l,mid,ql,qr),que(R,mid+1,r,ql,qr));
}
#undef L
#undef R
} sgt1,sgt2;
#define L tr[x].ls
#define R tr[x].rs
vector<int> G[M],oc[M];
int n,q,ans[M];
struct Query{
int l,r,k,w;
bool operator<(const Query &x) const{return k<x.k;}
} Q[M];
vector<Query> vc;
int sz[M],dep[M],top[M],big[M],f[M];
void dfs(int x,int fa){
dep[x]=dep[fa]+1,f[x]=fa,sz[x]=1;
for(int p:G[x]) if(p!=fa){
dfs(p,x),sz[x]+=sz[p],
(sz[p]>sz[big[x]])&&(big[x]=p);
}
}
void ctp(int x,int tp){
top[x]=tp;
if(big[x]) ctp(big[x],tp);
for(int p:G[x]) if(p!=f[x]&&p!=big[x])
ctp(p,p);
}
inline int LCA(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]) x=f[top[x]];
else y=f[top[y]];
}
return dep[x]<dep[y]?x:y;
}
int rt[M],tot;
struct Data{int cl,cr,ln;};
inline Data operator+(const Data &x,const Data &y){
Data r{x.cl,y.cr,x.ln+y.ln};
if(x.cl==x.ln) r.cl+=y.cl;
if(y.cr==y.ln) r.cr+=x.cr;
return r;
}
struct Node{int ls,rs;Data x;} tr[M<<5];
inline Data get(int x,int l,int r){return x?tr[x].x:Data{0,0,r-l+1};}
void ins(int &x,int l,int r,int i){
if(!x) x=++tot;
if(l==r) return tr[x].x={1,1,1},void();
int mid=l+r>>1;
if(i<=mid) ins(L,l,mid,i);
else ins(R,mid+1,r,i);
tr[x].x=get(L,l,mid)+get(R,mid+1,r);
}
void mer(int &x,int y,int l,int r){
if(!x||!y) return x|=y,void();
if(l==r) return;
int mid=l+r>>1;
mer(L,tr[y].ls,l,mid),mer(R,tr[y].rs,mid+1,r);
tr[x].x=get(L,l,mid)+get(R,mid+1,r);
}
Data que(int x,int l,int r,int ql,int qr){
if(!x) return Data{0,0,r-l+1};
if(ql<=l&&r<=qr) return tr[x].x;
int mid=l+r>>1;
if(qr<=mid) return que(L,l,mid,ql,qr);
if(ql>mid) return que(R,mid+1,r,ql,qr);
return que(L,l,mid,ql,qr)+que(R,mid+1,r,ql,qr);
}
void cal(int x){
ins(rt[x],1,n,x);
for(int p:G[x]) if(p!=f[x])
cal(p),mer(rt[x],rt[p],1,n);
for(int i:oc[x]){
int l=i-que(rt[x],1,n,1,i).cr+1;
int r=i+que(rt[x],1,n,i,n).cl-1;
vc.push_back({l,r,r-l+1,dep[x]});
}
vc.push_back({x,x,1,dep[x]});
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
scanf("%d",&n);
for(int i=1,u,v;i<n;++i)
scanf("%d%d",&u,&v),
G[u].push_back(v),
G[v].push_back(u);
scanf("%d",&q);
for(int i=1;i<=q;++i) scanf("%d%d%d",&Q[i].l,&Q[i].r,&Q[i].k),Q[i].w=i;
dfs(1,0),ctp(1,1);
for(int i=1;i<n;++i) oc[LCA(i,i+1)].push_back(i);
cal(1);
sort(vc.begin(),vc.end()),sort(Q+1,Q+q+1);
for(int i=q,j=vc.size()-1;i;--i){
while(j>=0&&vc[j].k>=Q[i].k){
sgt1.upd(1,1,n,vc[j].l,vc[j].w),
sgt2.upd(1,1,n,vc[j].r,vc[j].w);
--j;
}
ans[Q[i].w]=max(ans[Q[i].w],sgt1.que(1,1,n,Q[i].l,Q[i].r-Q[i].k+1));
ans[Q[i].w]=max(ans[Q[i].w],sgt2.que(1,1,n,Q[i].l+Q[i].k-1,Q[i].r));
}
sgt1.clear(1,1,n);
sort(vc.begin(),vc.end(),[](const Query &a,const Query &b){return a.l<b.l;});
sort(Q+1,Q+q+1,[](const Query &a,const Query &b){return a.l<b.l;});
for(int i=1,j=0;i<=q;++i){
while(j<(int)vc.size()&&vc[j].l<=Q[i].l) sgt1.upd(1,1,n,vc[j].r,vc[j].w),++j;
ans[Q[i].w]=max(ans[Q[i].w],sgt1.que(1,1,n,Q[i].r,n));
}
for(int i=1;i<=q;++i) printf("%d\n",ans[i]);
}