#include <iostream>
#include <vector>

using namespace std;

int n;
vector<int> node[500005];
int fa[500005][24],d[500005],lg[500005];
bool vis[500005];
void dfs(int u)
{
    vis[u]=1;
    for(int i=0;i<node[u].size();i++)
    {
        int v=node[u][i];
        if(vis[v]) continue;

        fa[v][0]=u;

        for(int j=0;fa[fa[v][j]][j]!=0;j++)
        {
            fa[v][j+1]=fa[fa[v][j]][j];
        }
        d[v]=d[u]+1;
        
        dfs(v);
    }
}

int lca(int x,int y)
{
    if(d[x]>d[y]) swap(x,y);

    while(d[x]<d[y])
    {
        y=fa[y][lg[d[x]-d[y]]];
    }

    while(x!=y)
    {
        int i=0;
        for(;fa[x][i+1]!=fa[y][i+1];i++);
        x=fa[x][i],y=fa[y][i];
    }
    return x;
}

struct line
{
    int l,r,suml;
} t[500005*4];

void update(int p)
{
    if(t[p].l==t[p].r) t[p].suml=t[p].l; 
    else
    {
        t[p].suml=lca(t[p*2].suml,t[p*2+1].suml);
    }
}

void build(int p,int l,int r)
{
    t[p].l=l,t[p].r=r;
    if(l<r)
    {
        int mid=(l+r)/2;
        build(p*2,l,mid);
        build(p*2+1,mid+1,r);
    }

    update(p);
}

int query(int p,int l,int r)
{
    if(t[p].r<l||t[p].l>r)
    {
        return -1;
    }
    if(l<=t[p].l&&t[p].r<=r)
    {
        return t[p].suml;
    }

    int res1=query(p*2,l,r),res2=query(p*2+1,l,r);
    if(res1==-1) return res2;
    if(res2==-1) return res1;
    return lca(res1,res2);
}

int main()
{
    freopen("query.in","r",stdin);
    freopen("query.out","w",stdout);

    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

    cin>>n;
    lg[0]=-1;
    for(int i=1;i<n;i++)
    {
        lg[i]=lg[i/2]+1;
        int u,v; cin>>u>>v;
        node[u].push_back(v),node[v].push_back(u);
    }
    lg[n]=lg[n/2]+1;

    d[1]=1;
    dfs(1);
    build(1,1,n);

    int q; cin>>q;
    while(q--)
    {
        int l,r,k; cin>>l>>r>>k;

        int ans=0;
        for(int i=l;i+k-1<=r;i++)
        {
            ans=max(ans,d[query(1,i,i+k-1)]);
        }
        cout<<ans<<"\n";
    }
    
    return 0;
}
