#include<cstdio>
#include<iostream>
#include<vector>
#include<set>
using namespace std;
const int N=1e6+10,Lg=20;
int n,m,q,ll[N],rr[N],ww[N],a[N],ans[N];
int e[N],last[N],nxt[N],em;
int rt[N],ls[N*Lg],rs[N*Lg],tt;
int hd,tl,d[N],dep[N],fa[N];
bool bz[N];
set<int>t1;
struct node
{
    int sum,lmx,rmx,l,r;
}t[N*Lg],zr={0,0,0,0,0};
node operator+(node x,node y)
{
    node z=zr;
    if(x.lmx==x.r-x.l+1) z.lmx=x.lmx+y.lmx;
    else z.lmx=x.lmx;
    if(y.rmx==y.r-y.l+1) z.rmx=y.rmx+x.rmx;
    else z.rmx=y.rmx;
    z.sum=max(max(x.sum,y.sum),x.rmx+y.lmx);
    z.r=y.r,z.l=x.l;
    return z;
}
void in(int x,int y)
{
    e[++em]=y;
    nxt[em]=last[x];
    last[x]=em;
}
void change(int x,int l,int r,int w,int s)
{
    if(l==r)
    {
        t[x].lmx=t[x].rmx=t[x].sum=1;
        return;
    }
    int mid=(l+r)/2;
    if(w<=mid)
    {
        if(!ls[x]) ls[x]=++tt,t[tt].l=l,t[tt].r=mid;
        change(ls[x],l,mid,w,s);
    }
    else
    {
        if(!rs[x]) rs[x]=++tt,t[tt].l=mid+1,t[tt].r=r;
        change(rs[x],mid+1,r,w,s);
    }
    t[x]=t[ls[x]]+t[rs[x]];
}
node query(int x,int l,int r,int L,int R)
{
    if(x==0) return {0,0,0,l,r};
    if(L<=l&&r<=R) return t[x];
    if(l>R||L>r) return {0,0,0,l,r};
    int mid=(l+r)/2;
    node sum=query(ls[x],l,mid,L,R)+query(rs[x],mid+1,r,L,R);
    return sum;
}
int merge(int rt1,int rt2,int l,int r)
{
    int mid=(l+r)/2;
    if(ls[rt1]&&ls[rt2]) ls[rt1]=merge(ls[rt1],ls[rt2],l,mid);
    else if(ls[rt2]) ls[rt1]=ls[rt2];
    if(rs[rt1]&&rs[rt2]) rs[rt1]=merge(rs[rt1],rs[rt2],mid+1,r);
    else if(rs[rt2]) rs[rt1]=rs[rt2];
    t[rt1]=t[ls[rt1]]+t[rs[rt1]];
    return rt1;
}
void bfs()
{
    hd=0,tl=1;
    d[1]=1,dep[1]=1,bz[1]=1;
    while(hd<tl)
    {
        ++hd;
        for(int k=last[d[hd]];k;k=nxt[k])
        {
            if(!bz[e[k]])
            {
                bz[e[k]]=1;
                d[++tl]=e[k];
                dep[tl]=dep[hd]+1;
                fa[e[k]]=d[hd];
            }
        }
    }
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int xx,yy;
        scanf("%d%d",&xx,&yy);
        in(xx,yy),in(yy,xx);
    }
    scanf("%d",&q);
    for(int i=1;i<=n;i++) rt[i]=++tt,t[tt].l=1,t[tt].r=n;
    for(int i=1;i<=q;i++) scanf("%d%d%d",&ll[i],&rr[i],&ww[i]),t1.insert(i);
    for(int i=1;i<=n;i++) change(rt[i],1,n,i,1);
    bfs();
    int sss=0;
    for(int k=n;k>=1;k--)
    {
        if(k==1)
            sss++;
        int x=d[k];
        vector<int>tmp;
        for(int j:t1)
        {
            node sum=query(rt[x],1,n,ll[j],rr[j]);
            if(sum.sum>=ww[j]) ans[j]=dep[k],tmp.push_back(j);
        }
        for(int j:tmp) t1.erase(j);
        rt[fa[x]]=merge(rt[fa[x]],rt[x],1,n);
    }
    for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
}
