#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=j;i<=k;++i)
int const N=5e5+10;
int n,q,siz[N],dep[N],heavy[N],add[N],sz,ans[N];
vector<int>a[N];
vector< pair<int,int> >qry1[N];
struct node{int l,r,dep;};
vector<node>V;
set< pair<int,int> >s;
inline void pre(int x,int fa){
siz[x]=1,dep[x]=dep[fa]+1;
for (auto v:a[x]){
if (v==fa) continue;
pre(v,x),siz[x]+=siz[v];
if (siz[v]>siz[heavy[x]]) heavy[x]=v;
}
}
inline void Add(int x,int fa){
add[++sz]=x;
for (auto v:a[x]) if (v^fa) Add(v,x);
}
inline void dfs(int x,int fa){
for (auto v:a[x]){
if (v==fa) continue;
if (v==heavy[x]) continue;
dfs(v,x),s.clear();
}
if (heavy[x]) dfs(heavy[x],x);
sz=0,add[++sz]=x;
for (auto v:a[x]){
if (v==fa) continue;
if (v==heavy[x]) continue;
Add(v,x);
}
sort(add+1,add+sz+1);
rep(i,1,sz){
int j=i;
while (j+1<=sz && add[j+1]==add[j]+1) ++j;
int L=add[i],R=add[j];
auto it=s.lower_bound({add[i],0});
if (it!=s.begin()){
--it;
if (it->second+1==L) L=it->first,s.erase(it);
}
it=s.lower_bound({add[j]+1,0});
if (it!=s.end()){
if (it->first==R+1) R=it->second,s.erase(it);
}
s.insert({L,R}),V.push_back((node){L,R,dep[x]}),i=j;
}
}
struct Tree_Array{
#define lowbit(x) (x&(-x))
int c[N];
inline void clear(int x){while (x) c[x]=0,x-=lowbit(x);}
inline void update(int x,int v){while (x) c[x]=max(c[x],v),x-=lowbit(x);}
inline int query(int x){int res=0;while (x<N) res=max(res,c[x]),x+=lowbit(x);return res;}
}T;
struct sode{int l,r,k,id;};
vector<sode>vec;
inline void divide(int l,int r){
if (l==r) return;
int mid=(l+r)>>1;
divide(l,mid),divide(mid+1,r);
int j=l-1;
rep(i,mid+1,r){
if (vec[i].id<0) continue;
while (j+1<=mid && vec[j+1].r<=vec[i].r){
++j;
if (vec[j].id<0) T.update(vec[j].l,-vec[j].id);
}
ans[vec[i].id]=max(ans[vec[i].id],T.query(vec[i].l));
}
rep(i,l,j) if (vec[i].id<0) T.clear(vec[i].l);
int L=l,R=mid+1;
vector<sode>vg;
while (L<=mid || R<=r){
if (L>mid) vg.push_back(vec[R]),++R;
else if (R>r) vg.push_back(vec[L]),++L;
else if (vec[L].r<=vec[R].r) vg.push_back(vec[L]),++L;
else vg.push_back(vec[R]),++R;
}
rep(i,l,r) vec[i]=vg[i-l];
}
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;
rep(i,1,n-1){
int u,v;cin>>u>>v;
a[u].push_back(v);
a[v].push_back(u);
}
pre(1,0),dfs(1,0),cin>>q;
rep(i,1,q){
int l,r,k;cin>>l>>r>>k;
if (r-l+1<k) continue;
qry1[l].push_back({l+k-1,i}),qry1[r-k+1].push_back({r,i});
if (r-l+1>k) vec.push_back((sode){l+1,r-1,k,i});
}
sort(V.begin(),V.end(),[](node A,node B){return A.l<B.l;});
int j=-1;
rep(i,1,n){
while (j+1<(int)V.size() && V[j+1].l==i) ++j,T.update(V[j].r,V[j].dep);
for (auto it:qry1[i]) ans[it.second]=max(ans[it.second],T.query(it.first));
}
for (auto i:V) vec.push_back((sode){i.l,i.r,i.r-i.l+1,-i.dep});
memset(T.c,0,sizeof(T.c));
sort(vec.begin(),vec.end(),[](sode A,sode B){return (A.k^B.k)?(A.k>B.k):(A.id<B.id);});
divide(0,vec.size()-1);
rep(i,1,q) cout<<ans[i]<<'\n';
return 0;
}