#include<bits/stdc++.h>
using namespace std;
const int N=1000005;
struct edge{
    int to,nxt;
}e[N<<1];
int st[N],num;
void adde(int x,int y){
    e[++num]=(edge){y,st[x]},st[x]=num;
}
int euler[N],dfn[N];
int dep[N];
int cnt;
int sn[N];
void dfs(int u,int pre){
    dfn[u]=++cnt;
    dep[u]=dep[pre]+1;
    euler[cnt]=dep[u];
    for(int i=st[u];i;i=e[i].nxt){
        int v=e[i].to;
        if(v==pre) continue;
        sn[u]++;
        dfs(v,u);
        euler[++cnt]=dep[u];
    }
}
int stmn[20][N],stmx[20][N],stdep[20][N];
int lg[N];
int querymn(int l,int r){
    int k=lg[r-l+1];
    return min(stmn[k][l],stmn[k][r-(1<<k)+1]);
}
int querymx(int l,int r){
    int k=lg[r-l+1];
    return max(stmx[k][l],stmx[k][r-(1<<k)+1]);
}
int query(int l,int r){
    int k=lg[r-l+1];
    return min(stdep[k][l],stdep[k][r-(1<<k)+1]);
}
int n,q;
struct SubtaskA{
    int L[N],R[N];
    bool check(int d,int k,int l,int r){
        l=max(l,L[rnk[d]]);
        r=min(r,R[rnk[d]]);
        return (r-l+1)>=k;
    }
    int rnk[N];
    void Main(){
    	mt19937 rnd(random_device {}());
        stack<int>s;
        for(int i=1;i<=n;i++){
            while(!s.empty()&&dep[s.top()]>dep[i]) s.pop();
            if(!s.empty()) L[i]=s.top()+1;
            else L[i]=i;
            s.push(i);
        }
        while(!s.empty()) s.pop();
        for(int i=n;i>=1;i--){
            while(!s.empty()&&dep[s.top()]>dep[i]) s.pop();
            if(!s.empty()) R[i]=s.top()-1;
            else R[i]=i;
            s.push(i);
        }
    	for(int i=1;i<=n;i++) stmn[0][i]=dep[i];
    	for(int i=1;i<=n;i++) stmx[0][i]=dep[i];
	    for(int i=2;i<=cnt;i++) lg[i]=lg[i>>1]+1;
	    for(int j=1;(1<<j)<=n;j++)
	        for(int i=1;i+(1<<j)-1<=n;i++)
	            stmn[j][i]=min(stmn[j-1][i],stmn[j-1][i+(1<<(j-1))]);
	    for(int j=1;(1<<j)<=n;j++)
	        for(int i=1;i+(1<<j)-1<=n;i++)
	            stmx[j][i]=max(stmx[j-1][i],stmx[j-1][i+(1<<(j-1))]);
        for(int i=1;i<=n;i++) rnk[dep[i]]=i;
        for(int i=1,l,r,k;i<=q;i++){
            scanf("%d%d%d",&l,&r,&k);
            int nl=querymn(l,r),nr=querymx(l,r),mid,ans=0;
            while(nl<=nr){
                mid=(nl+nr)>>1;
                if(check(mid,k,l,r)) ans=mid,nl=mid+1;
                else nr=mid-1;
            }
            for(int j=10;j>=1;j--){
                if(rnk[j]>=l&&rnk[j]<=r&&check(j,k,l,r)) ans=j;
			}
            printf("%d\n",ans);
        }
    }
}sub1;
int main(){
    freopen("query.in","r",stdin);
    freopen("query.out","w",stdout);
    cin>>n;
    for(int i=1,x,y;i<n;i++){
        scanf("%d%d",&x,&y);
        adde(x,y);
        adde(y,x);
    }
    dfs(1,0);
    cin>>q;
    bool flag=1;
    for(int i=1;i<=n;i++) flag&=(sn[i]<=1);
    if(flag){
        sub1.Main();
        return 0;
    }
    for(int i=1;i<=n;i++) stmn[0][i]=dfn[i];
    for(int i=1;i<=n;i++) stmx[0][i]=dfn[i];
    for(int i=1;i<=cnt;i++) stdep[0][i]=euler[i];
//    cout<<"Euler:";
//    for(int i=1;i<=cnt;i++) cout<<euler[i]<<" ";
//    cout<<endl;
    for(int i=2;i<=cnt;i++) lg[i]=lg[i>>1]+1;
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            stmn[j][i]=min(stmn[j-1][i],stmn[j-1][i+(1<<(j-1))]);
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            stmx[j][i]=max(stmx[j-1][i],stmx[j-1][i+(1<<(j-1))]);
    for(int j=1;(1<<j)<=cnt;j++)
        for(int i=1;i+(1<<j)-1<=cnt;i++)
            stdep[j][i]=min(stdep[j-1][i],stdep[j-1][i+(1<<(j-1))]);
    for(int i=1,l,r,k;i<=q;i++){
        scanf("%d%d%d",&l,&r,&k);
        int res=0;
        for(int j=l;j+k-1<=r;j++){
            int L=querymn(j,j+k-1),R=querymx(j,j+k-1);
            res=max(res,query(L,R));
        }
        printf("%d\n",res);
    }
}
