#include<bits/stdc++.h>
#define LL long long
#define LLL __int128
#define uint unsigned
#define ldb long double
#define uLL unsigned long long
using namespace std;
char rdc[1<<18],*rS,*rT;
#define gc() (rS==rT?rT=rdc+fread(rS=rdc,1,1<<18,stdin),rS==rT?EOF:*rS++:*rS++)
template<class T>inline void read(T&x){
x=0;char c;bool f=1;
while(!isdigit(c=gc()))if(c=='-')f=0;
if(f)do x=x*10+(c&15);while(isdigit(c=gc()));
else do x=x*10-(c&15);while(isdigit(c=gc()));
}
const int N=5e5+5;
int n,m,q,rt;
vector<int>G[N];
int fdl[N],fdr[N];
vector<pair<int,int>>nD[N],nQ[N];
vector<tuple<int,int,int>>D[N],Q[N];
int sz[N],son[N],c[N],d[N],ans[N],T[N*4];
inline void dfs(int u,int fa){
sz[u]=1,d[u]=d[fa]+1,son[u]=0;
for(auto v:G[u])if(v!=fa)dfs(v,u),sz[u]+=sz[v],sz[v]>sz[son[u]]?son[u]=v:0;
}
inline int findl(const int&x){
return fdl[x]==x?x:fdl[x]=findl(fdl[x]);
}
inline int findr(const int&x){
return fdr[x]==x?x:fdr[x]=findr(fdr[x]);
}
inline void ins(int u){
fdl[u]=u-1,fdr[u]=u+1;
int l=findl(u)+1,r=findr(u)-1;
D[r-l+1].emplace_back(l,r,d[rt]);
nD[l].emplace_back(r,d[rt]);
}
inline void ins(int u,int fa){
ins(u);
for(auto v:G[u])if(v!=fa)ins(v,u);
}
inline void clr(int u,int fa){
fdl[u]=u,fdr[u]=u;
for(auto v:G[u])if(v!=fa)clr(v,u);
}
inline void solve(int u,int fa){
for(auto v:G[u])if(v!=fa&&v!=son[u])solve(v,u),clr(v,u);
if(son[u])solve(son[u],u);
rt=u;
ins(u);
for(auto v:G[u])if(v!=fa&&v!=son[u])ins(v,u);
}
inline void add(int x,int y){
for(;x;x-=x&-x)c[x]=max(c[x],y);
}
inline int sum(int x){
int z=0;for(;x<=n;x+=x&-x)z=max(z,c[x]);return z;
}
inline void upd(int x,int y){
for(x+=m;x&&T[x]<y;x>>=1)T[x]=y;
}
inline int qry(int l,int r){
int z=0;
for(l+=m-1,r+=m+1;l^r^1;l>>=1,r>>=1){
if(~l&1)z=max(z,T[l^1]);
if( r&1)z=max(z,T[r^1]);
}
return z;
}
signed main(){
cin.tie(0)->sync_with_stdio(0);
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
read(n);
for(int i=1;i<n;++i){
int u,v;read(u),read(v);
G[u].emplace_back(v);
G[v].emplace_back(u);
}
iota(fdl,fdl+n+2,0),iota(fdr,fdr+n+2,0);
dfs(1,0),solve(1,0);
read(q);
for(int i=1;i<=q;++i){
int l,r,k;read(l),read(r),read(k);
Q[k].emplace_back(l,r,i);
nQ[l].emplace_back(r,i);
}
m=2<<__lg(n+1);
fill(T+1,T+m*2,0);
for(int k=n;k>=1;--k){
for(auto [l,r,i]:D[k])upd(l,i);
for(auto [l,r,i]:Q[k])ans[i]=max(ans[i],qry(l,r-k+1));
}
fill(T+1,T+m*2,0);
for(int k=n;k>=1;--k){
for(auto [l,r,i]:D[k])upd(r,i);
for(auto [l,r,i]:Q[k])ans[i]=max(ans[i],qry(l+k-1,r));
}
for(int l=1;l<=n;++l){
for(auto [r,i]:nD[l])add(r,i);
for(auto [r,i]:nQ[l])ans[i]=max(ans[i],sum(r));
}
for(int i=1;i<=q;++i)cout<<ans[i]<<'\n';
return 0;
}