#include<bits/stdc++.h>
using namespace std;
typedef int ll;
#define rep(i,a,b) for(ll i=(a);i<=(b);++i)
#define per(i,a,b) for(ll i=(a);i>=(b);--i)
bool Mbe;
ll read(){
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
void write(ll x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
const ll N=5e5+9;
ll n,q,hd[N],tote,dep[N];
ll fa[N],sz[N],son[N],top[N];
ll pre[N],nxt[N],w[N],ans[N],tot;
array<ll,4> ky[N<<1];
ll findpre(ll x){
return pre[x]==x?x:pre[x]=findpre(pre[x]);
}
ll findnxt(ll x){
return nxt[x]==x?x:nxt[x]=findnxt(nxt[x]);
}
vector<ll>psh[N];
struct Edg{
ll to,nxt;
}es[N<<1];
void adde(ll x,ll y){
es[++tote]=(Edg){y,hd[x]};
hd[x]=tote;
}
void dfs1(ll x,ll f){
fa[x]=f,sz[x]=1,dep[x]=dep[f]+1;
for(ll i=hd[x];i;i=es[i].nxt){
ll y=es[i].to;
if(y==f)continue;
dfs1(y,x);
sz[x]+=sz[y];
if(sz[y]>sz[son[x]])son[x]=y;
}
}
void dfs2(ll x,ll t){
top[x]=t;
if(!son[x])return ;
dfs2(son[x],t);
for(ll i=hd[x];i;i=es[i].nxt){
ll y=es[i].to;
if(y!=fa[x]&&y!=son[x])dfs2(y,y);
}
}
ll LCA(ll x,ll y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y])return x;
return y;
}
namespace SGT{
ll tr[N<<2];
void Pushup(ll x){
tr[x]=max(tr[x<<1],tr[x<<1|1]);
}
void Build(ll x,ll l,ll r){
if(l==r)return tr[x]=dep[l],void();
ll mid=(l+r)>>1;
Build(x<<1,l,mid),Build(x<<1|1,mid+1,r);
Pushup(x);
}
ll Query(ll x,ll l,ll r,ll ql,ll qr){
if(ql<=l&&r<=qr)return tr[x];
ll mid=(l+r)>>1;
if(qr<=mid)return Query(x<<1,l,mid,ql,qr);
if(ql>mid)return Query(x<<1|1,mid+1,r,ql,qr);
return max(Query(x<<1,l,mid,ql,qr),Query(x<<1|1,mid+1,r,ql,qr));
}
}
vector<array<ll,2> >vq[N],vo[N];
ll bit[N];
void Upd(ll x,ll k){
while(x)bit[x]=max(bit[x],k),x-=(x&(-x));
}
void Clr(ll x){
while(x)bit[x]=0,x-=(x&(-x));
}
ll Query(ll x){
ll res=0;
while(x<=n)res=max(res,bit[x]),x+=(x&(-x));
return res;
}
void solve(ll l,ll r){
if(l==r)return ;
ll mid=(l+r)>>1;
solve(l,mid),solve(mid+1,r);
ll ptr=l-1;
rep(i,mid+1,r){
while(ptr<mid&&ky[ptr+1][3]<=ky[i][3]){
ptr++;
if(ky[ptr][1]<0)Upd(ky[ptr][2],-ky[ptr][1]);
}
if(ky[i][1]>0)ans[ky[i][1]]=max(ans[ky[i][1]],Query(ky[i][2]));
}
rep(i,l,ptr){
if(ky[i][1]<0)Clr(ky[i][2]);
}
inplace_merge(ky+l,ky+mid+1,ky+r+1,[&](array<ll,4> a,array<ll,4> b){
return a[3]<b[3];
});
}
bool Med;
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
cerr<<fabs(&Med-&Mbe)/1048576.0<<"MB\n";
n=read();
rep(i,2,n){
ll x=read(),y=read();
adde(x,y),adde(y,x);
}
q=read();
dfs1(1,0),dfs2(1,1);
rep(i,1,n-1)w[i]=dep[LCA(i,i+1)];
iota(pre+1,pre+n+1,1);
iota(nxt+1,nxt+n+1,1);
rep(i,1,n-1)psh[w[i]].push_back(i);
per(i,n,1){
for(ll x:psh[i]){
ll L=findpre(x),R=findnxt(x+1);
vo[L].push_back({R,i});
ky[++tot]={R-L+1,-i,L,R};
pre[x+1]=x,nxt[x]=x+1;
}
}
SGT::Build(1,1,n);
rep(i,1,q){
ll l=read(),r=read(),k=read();
if(k==1){
ans[i]=SGT::Query(1,1,n,l,r);
}
else {
vq[l].push_back({l+k-1,i});
vq[r-k+1].push_back({r,i});
vq[l].push_back({r,i});
ky[++tot]={k,i,l,r};
}
}
rep(i,1,n){
for(array<ll,2> a:vo[i])Upd(a[0],a[1]);
for(array<ll,2> a:vq[i])ans[a[1]]=max(ans[a[1]],Query(a[0]));
}
memset(bit,0,sizeof(bit));
sort(ky+1,ky+tot+1,[&](array<ll,4> a,array<ll,4> b){
return a[0]>b[0]||(a[0]==b[0]&&a[1]<b[1]);
});
solve(1,tot);
rep(i,1,q)write(ans[i]),putchar('\n');
cerr<<"\n"<<clock()*1.0/CLOCKS_PER_SEC*1000<<"ms\n";
return 0;
}