#include <bits/stdc++.h>
#define RNG(_i,_a,_b) for(int _i=(_a),_i##_END=(_b); _i<=_i##_END; _i++)
#define IRNG(_i,_a,_b) for(int _i=(_a),_i##_END=(_b); _i>=_i##_END; _i--)
using namespace std;
const int MAXN=5e5+10;
int n,qn,ans[MAXN]; bool vis[MAXN];
vector<int> G[MAXN];
struct Qt{ int l,r,k,id; }; vector<Qt> Q[MAXN*4];
void ins(int id,int l,int r,int ql,int qr,Qt q){
    if(ql<=l&&r<=qr){
        Q[id].push_back(q); return; }
    auto mid=(l+r)/2;
    if(ql<=mid) ins(id*2,l,mid,ql,qr,q);
    if(mid<qr)  ins(id*2+1,mid+1,r,ql,qr,q);
}
void build(int id,int l,int r){
    sort(Q[id].begin(),Q[id].end(),[](auto x,auto y){ return x.k>y.k; });
    if(l==r) return;
    auto mid=(l+r)/2;
    build(id*2,l,mid),build(id*2+1,mid+1,r);
}
int curdep;
void tomax(int& x,int y){ x=max(x,y); }
struct SGT{
#define ls (T[u].ls_)
#define rs (T[u].rs_)
#define vls (T[v].ls_)
#define vrs (T[v].rs_)
#define mid ((l+r)/2)
    struct{ int ls_,rs_,len,lc,rc,c; } T[MAXN*20]; int nnd;
    void pushup(int u){
        T[u].lc=max(T[ls].lc,ls&&T[ls].c==T[ls].len?T[ls].len+T[rs].lc:0);
        T[u].rc=max(T[rs].rc,rs&&T[rs].c==T[rs].len?T[ls].rc+T[rs].len:0);
        T[u].c=max({T[ls].c,T[rs].c,T[ls].rc+T[rs].lc});
    }
    void new_(int& u,int id,int l,int r,int i){
        u=++nnd; T[u].len=r-l+1;
        while(Q[id].size()&&Q[id].back().k==1){
            tomax(ans[Q[id].back().id],curdep);
            Q[id].pop_back();
        }
        if(l==r){ T[u].lc=T[u].rc=T[u].c=1; return; }
        i<=mid ? new_(ls,id*2,l,mid,i) : new_(rs,id*2+1,mid+1,r,i);
        pushup(u);
    }
    int merge(int u,int v,int id,int l,int r,int len){
        if(!u||!v) u|=v;
        if(!u) return 0;
        auto calc=[this,u,id,len,l,r](){
            while(Q[id].size()&&(Q[id].back().k<=(ls||l==r?T[u].lc+len:0)||Q[id].back().k<=T[u].c)){
                tomax(ans[Q[id].back().id],curdep);
                Q[id].pop_back();
            }
        };
        calc();
        if(l==r) return u;
        ls=merge(ls,vls,id*2,l,mid,len);
        int len1=len;
        if(ls&&T[ls].c==T[ls].len) len1+=T[ls].len;
        else len1=T[ls].rc;
        rs=merge(rs,vrs,id*2+1,mid+1,r,len1);
        pushup(u);
        calc();
        return u;
    }
#undef ls
#undef rs
#undef mid
} sgt;
int dfs(int u,int fa,int d){
    curdep=d;
    int p=0; sgt.new_(p,1,1,n,u);
    for(int v:G[u]){
        if(v==fa) continue;
        int q=dfs(v,u,d+1);
        curdep=d;
        p=sgt.merge(p,q,1,1,n,0);
    }
    return p;
}
int main(){
    freopen("query.in","r",stdin);
    freopen("query.out","w",stdout);
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    cin>>n;
    RNG(_,1,n-1){
        int u,v; cin>>u>>v;
        G[u].push_back(v),G[v].push_back(u);
    }
    cin>>qn;
    RNG(i,1,qn){
        int l,r,k; cin>>l>>r>>k;
        ins(1,1,n,l+k-1,r,{l,r,k,i});
    }
    build(1,1,n);
    dfs(1,0,1);
    RNG(i,1,qn) cout<<ans[i]<<"\n";
}
