#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int n,u,v,fa[N][23],dep[N],maxdep,tree[N*2],q,l,r,k;
int head[N],nxt[N],to[N],cnt;
void add(int x,int y){nxt[++cnt]=head[x],head[x]=cnt,to[cnt]=y;}
void dfs(int x){
    for(int i=head[x];i;i=nxt[i]){
        int v=to[i];if(v==fa[x][0]) continue;
        fa[v][0]=x,dep[v]=dep[x]+1,dfs(v),maxdep=max(maxdep,dep[v]);
    }
}
int LCA(int u,int v){
    if(u==-1) return v;
    if(v==-1) return u;
    if(dep[u]<dep[v])swap(u,v);
    for(int i=20;i>=0;i--) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
    if(u==v) return u;
    for(int i=20;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
    return fa[u][0];
}
void build(int x,int l,int r){
    if(l==r){tree[x]=l;return;}
    int mid=(l+r)/2;
    build(x*2,l,mid),build(x*2+1,mid+1,r);
    if(tree[x*2]==1||tree[x*2+1]==1) tree[x]=1;
    else tree[x]=LCA(tree[x*2],tree[x*2+1]);
}
int query(int x,int l,int r,int L,int R){
    if(L>R||l>R||r<L||l>r) return -1;
    if(L<=l&&r<=R) return tree[x];
    int mid=(l+r)/2;
    if(L>mid) return query(x*2+1,mid+1,r,L,R);
    if(R<=mid) return query(x*2,l,mid,L,R);
    int u=query(x*2+1,mid+1,r,L,R),v=query(x*2,l,mid,L,R);
    if(u==1||v==1) return 1;
    return LCA(u,v);
}
int main(){
    freopen("query.in","r",stdin);
    freopen("query.out","w",stdout);
    scanf("%d",&n),maxdep=1;
    for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
    scanf("%d",&q);
    fa[1][0]=dep[1]=1,dfs(1);
    // if(maxdep==n){
    //     return 0;
    // }
    for(int j=1;j<=20;j++) for(int i=1;i<=n;i++) fa[i][j]=fa[fa[i][j-1]][j-1];
    build(1,1,n);
    for(int i=1;i<=q;i++){
        int ans=0;
        scanf("%d%d%d",&l,&r,&k);
        for(int j=l;j+k-1<=r;j++) ans=max(ans,dep[query(1,1,n,j,j+k-1)]);
        printf("%d\n",ans);
    }
}