#include<bits/stdc++.h>
#define psb push_back
typedef long long LL;
using namespace std;
inline int read(){
    char ch=getchar(); while(ch!='-' && !isdigit(ch)) ch=getchar();
    int x=0,ff=1; if(ch=='-') ff=-1,ch=getchar();
    while(isdigit(ch)) x=(x<<3) + (x<<1) + (ch^48),ch=getchar();
    return x*ff;
}
const int N=5e5+5,inf=1e9;
int n,Q,ql[N],qr[N],qk[N],fa[N],dep[N],ld[N],tot,b[N],sf[21][N],lgg[N],stt[21][N]; vector<int> e[N];
inline int dmn(int x,int y){return dep[x]<dep[y]?x:y;}
void dfs(int u,int Fa){
    fa[u]=Fa; dep[u]=dep[Fa]+1; b[ld[u]=++tot]=u;
    for(int v:e[u]) if(v!=Fa) dfs(v,u);
}
int LCA(int u,int v){
    if(u==v) return u;
    u=ld[u]; v=ld[v]; if(u>v) swap(u,v);
    ++u; int lm=lgg[v-u+1]; return fa[dmn(sf[lm][u],sf[lm][v-(1<<lm)+1])];
}
int qryx(int l,int r){
    int lm=lgg[r-l+1]; return LCA(stt[lm][l],stt[lm][r-(1<<lm)+1]);
}
struct dt{
    int lx,rx,mx,s;
    inline dt operator +(dt A) const {return {lx==s?lx+A.lx:lx,A.rx==A.s?A.rx+rx:A.rx,max({mx,A.mx,rx+A.lx}),s+A.s};}
} ;
struct node{
    int lc,rc; dt w;
} tr[N*23]; int rT[N];
inline void pushup(int p) {tr[p].w=tr[tr[p].lc].w+tr[tr[p].rc].w;}
inline void Mdf(int &p,int k,int L=1,int R=n){
    tr[++tot]=tr[p]; p=tot; if(L==R) {tr[p].w={1,1,1,1}; return ;}
    int mid=(L+R)/2; k<=mid?Mdf(tr[p].lc,k,L,mid):Mdf(tr[p].rc,k,mid+1,R); pushup(p);
}
inline dt Qry(int p,int l,int r,int L=1,int R=n){
    if(L>=l && R<=r) return tr[p].w;
    int mid=(L+R)/2;
    if(r<=mid) return Qry(tr[p].lc,l,r,L,mid);
    else if(l>mid) return Qry(tr[p].rc,l,r,mid+1,R);
    else return Qry(tr[p].lc,l,r,L,mid)+Qry(tr[p].rc,l,r,mid+1,R);
}
int main(){
    freopen("query.in","r",stdin);
    freopen("query.out","w",stdout);
    for(int i=2;i<N;i++) lgg[i]=lgg[i>>1]+1;
    n=read();
    for(int i=1;i<n;i++){
        int u=read(),v=read();
        e[u].psb(v); e[v].psb(u);
    }
    dfs(1,0); Q=read(); int dx=0;
    for(int i=1;i<=n;i++) dx=max(dx,dep[i]);
    if(dx==n &&  n>5000 && Q>5000){ tot=0;
        for(int i=1;i<=n;i++) b[dep[i]]=i;
        for(int i=n;i>=1;i--) rT[i]=rT[i+1],Mdf(rT[i],b[i]);
        for(int i=1;i<=Q;i++){
            ql[i]=read(); qr[i]=read(); qk[i]=read();
            int L=1,R=n+1;
            if(Qry(rT[2000],ql[i],qr[i]).mx<qk[i]) R=2000;
            else L=2000;
            while(L+1<R){
                int mid=(L+R)/2;
                if(Qry(rT[mid],ql[i],qr[i]).mx>=qk[i]) L=mid;
                else R=mid;
            }
            printf("%d\n",L);
        }
        return 0;
    }
    for(int i=1;i<=n;i++) sf[0][i]=b[i],stt[0][i]=i;
    for(int i=1;i<=lgg[n];i++)
        for(int j=1;j<=n-(1<<i)+1;j++) sf[i][j]=dmn(sf[i-1][j],sf[i-1][j+(1<<(i-1))]);
    for(int i=1;i<=lgg[n];i++)
        for(int j=1;j<=n-(1<<i)+1;j++) stt[i][j]=LCA(stt[i-1][j],stt[i-1][j+(1<<(i-1))]);
    for(int i=1;i<=Q;i++){
        ql[i]=read(); qr[i]=read(); qk[i]=read();
        if((n<=5000 && Q<=5000) || qk[i]==qr[i]-ql[i]+1){
            int mx=0;
            for(int j=ql[i];j<=qr[i]-qk[i]+1;j++) mx=max(mx,dep[qryx(j,j+qk[i]-1)]);
            printf("%d\n",mx);
        }
        else puts("0");
    }
    return 0;
}
/*
g++ query.cpp -o query -Wl,-stack=999999999 -Wall -std=c++14
*/