#include<bits/stdc++.h>
#define For(i,l,r) for(int i=l,i##end=r;i<=i##end;++i)
#define rFor(i,r,l) for(int i=r,i##end=l;i>=i##end;--i)
#define all(a) a.begin(),a.end()
#define vect basic_string
#define cmin(a,b) a=min(a,b)
#define cmax(a,b) a=max(a,b)
using namespace std;
using ll=long long;
using pii=array<int,2>;
using a3=array<int,3>;
const int N=5e5+10;
int n,q;
vect<int> t[N];
int dp[N],ans[N],dfn[N],dt,f[N];
template<typename T> struct ST {
T f[20][N];
void bd() {
For(i,1,__lg(n)) For(j,1,n-(1<<i)+1)
f[i][j]=max(f[i-1][j],f[i-1][j+(1<<i-1)]);
}
T que(int l,int r) {
int k=__lg(r-l+1);
return max(f[k][l],f[k][r-(1<<k)+1]);
}
};
ST<int> k1; ST<pii> l1;
ST<pii> f1;
void dfs(int u,int fa) {
dp[u]=dp[fa]+1;
dfn[u]=++dt; l1.f[0][dt]={-dp[u],fa};
for(auto v:t[u]) {
t[v].erase(find(all(t[v]),u));
dfs(v,u);
}
}
int lca(int u,int v) {
if(u==v) return u;
u=dfn[u]; v=dfn[v]; if(u>v) swap(u,v);
return l1.que(u+1,v)[1];
}
vect<a3> que[N];
int L[N],R[N],fa[N],d[N];
int bd(int l,int r) {
if(l>=r) return 0;
int m=f1.que(l,r-1)[1]; L[m]=l; R[m]=r;
int ls=bd(l,m),rs=bd(m+1,r);
if(ls) fa[ls]=m,++d[m];
if(rs) fa[rs]=m,++d[m];
return m;
}
namespace DS {
#define ls (k<<1)
#define rs (ls|1)
const int S=N<<2;
int tr[S];
void pu(int k) {
tr[k]=max(tr[ls],tr[rs]);
}
void upd(int p,int x,int k=1,int l=1,int r=n) {
if(l==r) return tr[k]=x,void();
int m=l+r>>1;
p<=m?upd(p,x,ls,l,m):upd(p,x,rs,m+1,r);
pu(k);
}
int que(int L,int R,int k=1,int l=1,int r=n) {
if(L<=l && r<=R) return tr[k];
int m=l+r>>1,s=0;
if(L<=m) cmax(s,que(L,R,ls,l,m));
if(m<R) cmax(s,que(L,R,rs,m+1,r));
return s;
}
#undef ls
#undef rs
}
int nr[N];
struct myset {
int tr[N];
void upd(int k,int x) {
for(;k<=n;k+=k&-k) tr[k]+=x;
}
int q1(int k) {
int s=0;
for(;k;k&=k-1) s+=tr[k];
return s;
}
int que(int p) {
int s=q1(p),k=0;
rFor(i,__lg(n),0) if((k|1<<i)<=n && s>tr[k|1<<i]) {
s-=tr[k|=1<<i];
}
return k+!!k;
}
}lp;
vect<int> td[N];
void ins(int id) {
if(!id || d[id]) return;
int L=::L[id],R=::R[id];
td[R-L+1]+=id;
DS::upd(L,f[id]); nr[L]=R; lp.upd(L,1);
}
int main() {
#ifdef LOCAL
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#else
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
#endif
ios::sync_with_stdio(0); cin.tie(0);
cin>>n;
For(i,1,n-1) {
int u,v; cin>>u>>v;
t[u]+=v; t[v]+=u;
}
dfs(1,0);
For(i,1,n) k1.f[0][i]=dp[i];
k1.bd(); l1.bd();
For(i,1,n-1) f[i]=dp[lca(i,i+1)],f1.f[0][i]={-f[i],i};
f1.bd();
bd(1,n);
For(i,1,n-1) ins(i);
cin>>q;
For(i,1,q) {
int l,r,k; cin>>l>>r>>k;
if(k==1) {
ans[i]=k1.que(l,r);
} else {
ans[i]=max(-f1.que(l,l+k-2)[0],-f1.que(r-k+1,r-1)[0]);
que[k]+={l,r,i};
}
}
For(k,2,n) {
for(auto [l,r,id]:que[k]) {
int p=lp.que(r);
if(!p) continue;
if(nr[p]>r) r=p-1;
if(l<=r) cmax(ans[id],DS::que(l,r));
}
for(auto id:td[k]) {
DS::upd(L[id],0); nr[L[id]]=0; lp.upd(L[id],-1);
--d[fa[id]]; ins(fa[id]);
}
}
For(i,1,q) cout<<ans[i]<<"\n";
}