#include<cstdio>
#include<algorithm>
#define F(i,l,r) for(int i=(l),i##_end=(r);i<i##_end;++i)
using namespace std;
typedef long long ll;
constexpr int N=5e5+5,LogN=21;
namespace seg
{
constexpr int N=(1<<20)+5;
int n,s[N];
void build(int n_)
{
n=1<<(n_<=1?0:32-__builtin_clz(n_-1));
F(i,1,2*n)s[i]=0;
}
void update(int x,int y){for(x+=n;x;x>>=1)s[x]=max(s[x],y);}
int query(int l,int r)
{
int ans=0;
for(l+=n,r+=n;l<r;l>>=1,r>>=1)
{
if(l&1)ans=max(ans,s[l++]);
if(r&1)ans=max(ans,s[--r]);
}
return ans;
}
}
struct edge
{
int next,to;
}e[2*N];
struct interval
{
int l,r,v;
}a[N];
struct query
{
int l,r,k,id;
}qy[N];
int n,logn,hd[N],cnt,dep[N],dfn[N],ind,idfn[N],ht[N],ans[N];
ll st[LogN][N];
void addedge(int u,int v)
{
e[cnt]={hd[u],v};
hd[u]=cnt++;
}
void dfs(int u,int fa)
{
idfn[dfn[u]=ind++]=u;
for(int i=hd[u];~i;i=e[i].next)if(e[i].to!=fa)
{
int v=e[i].to;
dep[v]=dep[u]+1;
st[0][ind-1]=dep[u];
dfs(v,u);
}
}
int lcadep(int u,int v)
{
u=dfn[u];v=dfn[v];
if(u>v)swap(u,v);
int k=31^__builtin_clz(v-u);
return (int)min(st[k][u],st[k][v-(1<<k)]);
}
ll querymin(int l,int r)
{
int k=31^__builtin_clz(r-l);
return min(st[k][l],st[k][r-(1<<k)]);
}
ll querymax(int l,int r)
{
int k=31^__builtin_clz(r-l);
return max(st[k][l],st[k][r-(1<<k)]);
}
void build(int l,int r)
{
if(l==r)return;
ll qr=querymin(l,r);
int val=(int)(qr>>32),pos=(int)(qr&((1ll<<32)-1));
a[pos]={l,r,val};
build(l,pos);
build(pos+1,r);
}
int main()
{
#ifndef LOCAL
#ifndef ONLINE_JUDGE
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
#endif
#endif
scanf("%d",&n);
F(i,0,n)hd[i]=-1;
F(i,0,n-1)
{
int u,v;scanf("%d%d",&u,&v);--u,--v;
addedge(u,v);
addedge(v,u);
}
dep[0]=1;
dfs(0,0);
while((1<<logn)<=n)++logn;
F(i,0,logn)F(j,0,n-(2<<i))st[i+1][j]=min(st[i][j],st[i][j+(1<<i)]);
F(i,0,n-1)ht[i]=lcadep(i,i+1);
F(i,0,n)st[0][i]=(ll)ht[i]<<32|i;
F(i,0,logn)F(j,0,n+1-(2<<i))st[i+1][j]=min(st[i][j],st[i][j+(1<<i)]);
build(0,n);
F(i,0,n)st[0][i]=dep[i];
F(i,0,logn)F(j,0,n+1-(2<<i))st[i+1][j]=max(st[i][j],st[i][j+(1<<i)]);
int q;scanf("%d",&q);
F(i,0,q)
{
scanf("%d%d%d",&qy[i].l,&qy[i].r,&qy[i].k),--qy[i].l,--qy[i].k,qy[i].id=i;
if(!qy[i].k)ans[i]=(int)querymax(qy[i].l,qy[i].r);
else --qy[i].r;
}
sort(qy,qy+q,[](const query &u,const query &v){return u.k>v.k;});
sort(a,a+n,[](const interval &u,const interval &v){return u.r-u.l>v.r-v.l;});
seg::build(n);
for(int i=0,j=0;i<q;++i)if(qy[i].k)
{
for(;j<n&&a[j].r-a[j].l>=qy[i].k;++j)seg::update(a[j].l,a[j].v);
ans[qy[i].id]=max(ans[qy[i].id],seg::query(qy[i].l,qy[i].r-qy[i].k+1));
}
sort(qy,qy+q,[](const query &u,const query &v){return u.l<v.l;});
sort(a,a+n,[](const interval &u,const interval &v){return u.l<v.l;});
seg::build(n);
for(int i=0,j=0;i<q;++i)if(qy[i].k)
{
for(;j<n&&a[j].l<=qy[i].l;++j)seg::update(a[j].r-1,a[j].v);
ans[qy[i].id]=max(ans[qy[i].id],seg::query(qy[i].l+qy[i].k-1,n));
}
F(i,0,q)printf("%d\n",ans[i]);
return 0;
}