#include<bits/stdc++.h>
#define mkp make_pair
#define cln cerr<<"Line: "<<__LINE__<<" "
using namespace std;
const int N=(1<<20)+100;
using ll=long long;
using ul=unsigned long long;
using vt=vector<int>;
int T,n,m,K,d[N],f[N],rp,ans[N],mst,cnt,t1;
int mn[22][N],dfn[N],dlt,sz[N],lc[N],rev[N];
int dmn(int x,int y){return d[x]<d[y]?x:y;}
int lca(int l,int r){
if(l==r)return l;
if((l=dfn[l])>(r=dfn[r]))swap(l,r);
int k=__lg(r-l);
return dmn(mn[k][r],mn[k][l+(1<<k)]);
}
vt lk[N],h[N],h2[N];
struct dat{
int l,r,k;
}d1[N*3],d2[N*3];
void dfs(int x){
mn[0][dfn[x]=++dlt]=f[x];
sz[rev[dlt]=x]=1;
for(int y:lk[x]){
auto it=lk[y].begin();
while(*it!=x)++it;
d[y]=d[x]+1,f[y]=x;
lk[y].erase(it),dfs(y);
if(sz[y]>sz[lc[x]])lc[x]=y;
sz[x]+=sz[y];
}
}
int L[N];
namespace DSU{
int f[N];
int gf(int x){return x==f[x]?x:f[x]=gf(f[x]);}
void init(){
for(int x=1;x<=n;++x)f[x]=L[x]=x;
}
void rec(int x){
if(f[x]!=x)return;
int k=gf(x+1);
L[k]=L[x],f[x]=f[k];
d1[++t1]={L[x],k,K};
}
}
using DSU::rec;
void sol(int x){
if(x>1&&d[lca(x-1,x)]==K)rec(x-1);
if(x<n&&d[lca(x,x+1)]==K)rec(x);
}
int mx[N];
#define ls x<<1
#define rs x<<1|1
void build(int x,int l,int r){
mx[x]=0;
if(l<r){
int md=l+r>>1;
build(ls,l,md);
build(rs,md+1,r);
}
}
void cg(int x,int l,int r,int p,int d){
mx[x]=max(mx[x],d);
if(l<r){
int md=l+r>>1;
if(p>md)cg(rs,md+1,r,p,d);
else cg(ls,l,md,p,d);
}
}
void ask(int x,int l,int r,int L,int R){
if(l>=L&&r<=R)mst=max(mst,mx[x]);
else{
int md=l+r>>1;
if(L<=md)ask(ls,l,md,L,R);
if(md<R)ask(rs,md+1,r,L,R);
}
}
int main(){
ios::sync_with_stdio(false),cin.tie(0);
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
int i,j,k,l,r,x,y,z;
cin>>n;
for(i=1;i<n;++i){
cin>>x>>y;
lk[x].push_back(y);
lk[y].push_back(x);
}d[1]=1,dfs(1);
for(k=1;n>>k;++k)
for(r=1<<k;r<=n;++r)
mn[k][r]=dmn(mn[k-1][r],mn[k-1][r-(1<<k-1)]);
rp=*max_element(d+1,d+n+1);
for(x=1;x<=n;++x)h[d[x]].push_back(x);
DSU::init();
for(K=n;K;--K){
for(int x:h[K]){
d1[++t1]={x,x,K};
sol(x);
for(int y:lk[x])
if(y!=lc[x]){
for(i=0;i<sz[y];++i)
sol(rev[dfn[y]+i]);
}
}
}
for(i=1;i<=n;++i)h[i].clear();
for(i=1;i<=t1;++i)h[d1[i].r].push_back(i);
for(i=1,cin>>m;i<=m;++i){
cin>>l>>r>>k;
d2[i]={l,r,k};
h2[r].push_back(i);
}
for(r=n;r;--r){
for(int p:h[r])
cg(1,1,n,d1[p].l,d1[p].k);
for(int p:h2[r]){
mst=0,ask(1,1,n,1,d2[p].r-d2[p].k+1);
ans[p]=max(ans[p],mst);
}
}
for(i=1;i<=n;++i)h[i].clear(),h2[i].clear();
build(1,1,n);
for(i=1;i<=t1;++i)h[d1[i].r-d1[i].l+1].push_back(i);
for(i=1;i<=m;++i)h2[d2[i].k].push_back(i);
for(r=n;r;--r){
for(int p:h[r])
cg(1,1,n,d1[p].r,d1[p].k);
for(int p:h2[r]){
mst=0,ask(1,1,n,d2[p].l+d2[p].k-1,d2[p].r);
ans[p]=max(ans[p],mst);
}
}
for(i=1;i<=m;++i)printf("%d\n",ans[i]);
return 0;
}