#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
char ST;
const int NN=5e5+7;
const int N=5e3+7,M=1e6+7,Log=13,Log1=21;
int n,q,ls[NN],nx[M*100],to[M*100],cnt,dep[NN];
int F[NN][Log1],A[N][N],T[N*4][N],t[NN*4];
char ED;
void read(int &x){
    x=0;
    char ch=getchar();
    while(!isdigit(ch))
        ch=getchar();
    while(isdigit(ch)){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
}
void dfs(int x,int f){
    F[x][0]=f;
    for(int i=1;i<Log;++i)
        F[x][i]=F[F[x][i-1]][i-1];
    dep[x]=dep[f]+1;
    for(int i=ls[x];i;i=nx[i])
        if(to[i]!=f)
            dfs(to[i],x);
}
int LCA(int u,int v){
    if(dep[u]<dep[v])
        swap(u,v);
    if(v==1)
        return v;
    for(int i=Log-1;i>=0;--i)
        if(dep[F[u][i]]>=dep[v])
            u=F[u][i];
    if(u==v)
        return u;
    for(int i=Log-1;i>=0;--i)
        if(F[u][i]!=F[v][i]){
            u=F[u][i];
            v=F[v][i];
        }
    return F[u][0];
}
void dfs1(int x,int f){
    F[x][0]=f;
    for(int i=1;i<Log1;++i)
        F[x][i]=F[F[x][i-1]][i-1];
    dep[x]=dep[f]+1;
    for(int i=ls[x];i;i=nx[i])
        if(to[i]!=f)
            dfs1(to[i],x);
}
int LCA1(int u,int v){
    if(dep[u]<dep[v])
        swap(u,v);
    if(v==1)
        return v;
    for(int i=Log1-1;i>=0;--i)
        if(dep[F[u][i]]>=dep[v])
            u=F[u][i];
    if(u==v)
        return u;
    for(int i=Log1-1;i>=0;--i)
        if(F[u][i]!=F[v][i]){
            u=F[u][i];
            v=F[v][i];
        }
    return F[u][0];
}
void push_up(int bh,int x){
    T[x][bh]=max(T[x<<1][bh],T[x<<1|1][bh]);
}
void build(int bh,int l,int r,int x){
    if(l==r){
        T[x][bh]=dep[A[l][bh]];
        return ;
    }
    int mid=l+r>>1;
    build(bh,l,mid,x<<1);
    build(bh,mid+1,r,x<<1|1);
    push_up(bh,x);
}
int query(int bh,int l,int r,int L,int R,int x){
    if(L>R)
        return 0;
    if(L<=l&&r<=R)
        return T[x][bh];
    int mid=l+r>>1,res=0;
    if(L<=mid)
        res=query(bh,l,mid,L,R,x<<1);
    if(mid<R)
        res=max(res,query(bh,mid+1,r,L,R,x<<1|1));
    return res;
}
void build1(int l,int r,int x){
    if(l==r){
        t[x]=l;
        return ;
    }
    int mid=l+r>>1;
    build1(l,mid,x<<1);
    build1(mid+1,r,x<<1|1);
    t[x]=LCA1(t[x<<1],t[x<<1|1]);
}
int query1(int l,int r,int L,int R,int x){
    if(L<=l&&r<=R)
        return t[x];
    int mid=l+r>>1,res=-1;
    if(L<=mid)
        res=query1(l,mid,L,R,x<<1);
    if(mid<R){
        if(res==-1)
            res=query1(mid+1,r,L,R,x<<1|1);
        else
            res=LCA1(query1(mid+1,r,L,R,x<<1|1),res);
    }
    return res;
}
int main(){
    freopen("query.in","r",stdin);
    freopen("query.out","w",stdout);
    read(n);
    for(int i=1;i<n;++i){
        int u,v;
        read(u),read(v);
        nx[++cnt]=ls[u],to[ls[u]=cnt]=v;
        nx[++cnt]=ls[v],to[ls[v]=cnt]=u;
    }
    if(n>5000){
        dfs1(1,0);
        build1(1,n,1);
        read(q);
        while(q--){
            int l,r,k;
            read(l),read(r),read(k);
            printf("%d\n",dep[query1(1,n,l,r,1)]);
        }
        return 0;
    }
    dfs(1,0);
    for(int i=1;i<=n;++i){
        A[i][1]=i;
        for(int j=2;i+j-1<=n;++j)
            A[i][j]=LCA(A[i][j-1],i+j-1);
    }
    for(int i=1;i<=n;++i)
        build(i,1,n,1);
    scanf("%d",&q);
    while(q--){
        int l,r,k;
        read(l),read(r),read(k);
        printf("%d\n",query(k,1,n,l,r-k+1,1));
    }
    return 0;
}
