#include <bits/stdc++.h>
#define N 500011
using namespace std;
vector<int> G[N];int n,q,a[N];
namespace IO
{
char Is[(1<<21)+10],Os[(1<<21)+10];int Ipt=1<<21,Opt;
char gc()
{
if(Ipt==(1<<21))Is[fread(Is,1,1<<21,stdin)]=0,Ipt=0;
return Is[Ipt++];
}
void flush(){fwrite(Os,1,Opt,stdout);Opt=0;}
void pc(char x)
{
Os[Opt++]=x;
if(Opt==(1<<21))flush();
}
int read()
{
int x=0;char c=gc();
while(c<'0'||c>'9')c=gc();
while(c<='9'&&c>='0')x=x*10+c-'0',c=gc();
return x;
}
void write(int x){if(x<10)pc(x+'0');else write(x/10),pc(x%10+'0');}
}
using namespace IO;
namespace lca
{
int dep[N],st[21][N],h[N],dfn[N],clk;
void dfs(int u,int F)
{
dep[u]=dep[F]+1;dfn[u]=++clk;
for(int v:G[u])if(v^F)
{
h[clk]=u;
dfs(v,u);
}
}
void proc()
{
dfs(1,0);
for(int i=1;i<n;++i)st[0][i]=h[i];
for(int i=1;i<=20;++i)
{
for(int j=1;j+(1<<i)-1<n;++j)
{
int u1=st[i-1][j],u2=st[i-1][j+(1<<i-1)];
st[i][j]=dep[u1]<dep[u2]?u1:u2;
}
}
}
int lca(int u,int v)
{
if(u==v)return u;
if(dfn[u]>dfn[v])swap(u,v);
int logl=__lg(dfn[v]-dfn[u]);
int u1=st[logl][dfn[u]],u2=st[logl][dfn[v]-(1<<logl)];
return dep[u1]<dep[u2]?u1:u2;
}
}
int st[21][N],dd[21][N];
int qd(int l,int r)
{
int logl=__lg(r-l+1);
return max(dd[logl][l],dd[logl][r-(1<<logl)+1]);
}
int query(int l,int r)
{
int logl=__lg(r-l+1);
return min(st[logl][l],st[logl][r-(1<<logl)+1]);
}
struct BIT
{
int c[N];
void add(int x,int p){for(;x<n;x+=x&-x)c[x]=max(c[x],p);}
int query(int x){int ans=0;for(;x;x-=x&-x)ans=max(ans,c[x]);return ans;}
}Tr,Tl;
int L[N],R[N];
struct node{int l,r,v;};
vector<node> vu[N];
int ans[N];
struct kueri{int l,r,k,id;};
vector<kueri> vk[N];
namespace sgt
{
int mx[N*4],D;
void modi(int k,int p)
{
k+=D;
mx[k]=p;while(k>>=1)mx[k]=max(mx[k<<1],mx[k<<1|1]);
}
int query(int l,int r)
{
l+=D-1;r+=D+1;int ans=0;
while(l^r^1)
{
if(!(l&1))ans=max(ans,mx[l^1]);
if(r&1)ans=max(ans,mx[r^1]);
l>>=1;r>>=1;
}
return ans;
}
}
int main()
{
freopen("query.in","r",stdin);freopen("query.out","w",stdout);
n=read();
for(int i=1;i<n;++i){int u,v;u=read();v=read();G[u].push_back(v);G[v].push_back(u);}
lca::proc();
for(int i=1;i<=n;++i)dd[0][i]=lca::dep[i];
for(int i=1;i<=20;++i)
{
for(int j=1;j+(1<<i)-1<=n;++j)
{
dd[i][j]=max(dd[i-1][j],dd[i-1][j+(1<<i-1)]);
}
}
for(int i=1;i<n;++i)a[i]=lca::dep[lca::lca(i,i+1)];
for(int i=1;i<n;++i)st[0][i]=a[i];
for(int i=1;i<=20;++i)
{
for(int j=1;j+(1<<i)-1<n;++j)
{
st[i][j]=min(st[i-1][j],st[i-1][j+(1<<i-1)]);
}
}
q=read();for(int i=1;i<=q;++i)
{
int l,r,k;
l=read();r=read();k=read();
if(k>1)
{
vk[k-1].push_back({l,r-1,k-1,i});
ans[i]=max(query(l,l+k-2),query(r-k+1,r-1));
}
else
{
ans[i]=qd(l,r);
}
}
for(int i=1;i<n;++i)L[i]=i-1,R[i]=i+1;
for(int i=1;i<n;++i)while(L[i]&&a[L[i]]>=a[i])L[i]=L[L[i]];
for(int i=n-1;i;--i)while(R[i]<n&&a[R[i]]>a[i])R[i]=R[R[i]];
for(int i=1;i<n;++i)vu[R[i]-L[i]-1].push_back({L[i]+1,R[i]-1,a[i]});
sgt::D=1;while(sgt::D<=n+5)sgt::D<<=1;
for(int i=n-1;i;--i)
{
for(node u:vu[i])
{
Tr.add(u.r,u.r);
Tl.add(n-u.l,n-u.l);
sgt::modi(u.r,u.v);
}
for(kueri k:vk[i])
{
k.l=n-Tl.query(n-k.l);
k.r=Tr.query(k.r);
if(k.l<=k.r)ans[k.id]=max(ans[k.id],sgt::query(k.l,k.r));
}
}
for(int i=1;i<=q;++i)write(ans[i]),pc(10);flush();
fclose(stdin);fclose(stdout);return 0;
}