#include<bits/stdc++.h>
#define pr pair
#define f first
#define s second
#define ll long long
#define mp make_pair
#define pii pr<int,int>
#define piii pr<int,pii>
using namespace std;
int rd()
{
char c=getchar_unlocked();
while(c<'0'||c>'9') c=getchar_unlocked();
int r=0;
while(c>='0'&&c<='9')
{
r=r*10+(c^48);
c=getchar_unlocked();
}
return r;
}
void opp(int x)
{
if(x>=10) opp(x/10);
putchar_unlocked('0'+x%10);
}
void op(int x)
{
opp(x);
putchar_unlocked('\n');
}
struct node
{
int l,r;
int mx;
} nd[1100006];
int t;
void bd(int i,int l,int r)
{
node&x=nd[i];
x.l=l;
x.r=r;
x.mx=0;
if(l==r-1) return;
bd(i*2,l,l+r>>1);
bd(i*2+1,l+r>>1,r);
}
void st(int i,int l,int v)
{
node&x=nd[i];
x.mx=max(x.mx,v);
if(x.l==x.r-1) return;
int m=x.l+x.r>>1;
if(l<m) st(i*2,l,v);
else st(i*2+1,l,v);
}
int ask(int i,int l,int r)
{
node&x=nd[i];
if(x.l>=l&&x.r<=r) return x.mx;
int m=x.l+x.r>>1,rt=0;
if(l<m) rt=max(rt,ask(i*2,l,r));
if(r>m) rt=max(rt,ask(i*2+1,l,r));
return rt;
}
vector<int> e[500005];
int dp[500005];
int fa[19][500005];
pii gr[19][500005];
pii gl[19][500005];
int hr[19][500005];
int hl[19][500005];
int pd[1000006];
int dt[500005];
int tl[500005];
int tr[500005];
vector<pii> alv[500005];
vector<pii> arv[500005];
int ras[1000006];
vector<piii> ql[500005];
vector<piii> qr[500005];
void dfs(int x,int p=0,int d=1)
{
dp[x]=d;
fa[0][x]=p;
for(int to:e[x]) if(to!=p) dfs(to,x,d+1);
}
int lca(int x,int y)
{
if(dp[x]<dp[y]) swap(x,y);
for(int i=18;i>=0;i--) if(dp[x]-(1<<i)>=dp[y]) x=fa[i][x];
if(x==y) return x;
for(int i=18;i>=0;i--) if(fa[i][x]!=fa[i][y]) x=fa[i][x],y=fa[i][y];
return fa[0][x];
}
pii fd(int l,int r)
{
int h=pd[r-l];
return min(gr[h][l],gl[h][r]);
}
int fmx(int l,int r)
{
int h=pd[r-l];
return max(hr[h][l],hl[h][r]);
}
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios_base::sync_with_stdio(0);
int n=rd();
int ux,vx;
for(int i=1;i<n;i++)
{
ux=rd()-1;
vx=rd()-1;
e[ux].push_back(vx);
e[vx].push_back(ux);
}
dfs(0);
for(int i=1;i<19;i++) for(int j=0;j<n;j++) fa[i][j]=fa[i-1][fa[i-1][j]];
for(int i=1;i<n;i++) dt[i]=dp[lca(i,i-1)];
for(int i=0;i<n-1;i++) gr[0][i]=mp(dt[i+1],i+1);
for(int i=1;i<n;i++) gl[0][i]=mp(dt[i],i);
for(int i=0;i<n;i++) hr[0][i]=dp[i];
for(int i=1;i<=n;i++) hl[0][i]=dp[i-1];
for(int i=1;i<19;i++)
{
for(int j=0;j<n;j++)
{
if(j+(1<<i)<n) gr[i][j]=min(gr[i-1][j],gr[i-1][j+(1<<(i-1))]);
if(j-(1<<i)>=0) gl[i][j]=min(gl[i-1][j],gl[i-1][j-(1<<(i-1))]);
}
}
for(int i=1;i<19;i++)
{
for(int j=0;j<=n;j++)
{
if(j+(1<<i)<=n) hr[i][j]=max(hr[i-1][j],hr[i-1][j+(1<<(i-1))]);
if(j-(1<<i)>=0) hl[i][j]=max(hl[i-1][j],hl[i-1][j-(1<<(i-1))]);
}
}
for(int i=0;i<19;i++) for(int j=1<<i;j<=1<<(i+1);j++) pd[j]=i;
vector<int> v;
v.push_back(0);
for(int i=1;i<n;i++)
{
while(v.back()!=0)
{
if(dt[v.back()]<dt[i]) break;
v.pop_back();
}
tl[i]=v.back();
v.push_back(i);
}
v.clear();
v.push_back(n);
for(int i=n-1;i>0;i--)
{
while(v.back()!=n)
{
if(dt[v.back()]<dt[i]) break;
v.pop_back();
}
tr[i]=v.back()-1;
v.push_back(i);
}
for(int i=1;i<n;i++)
{
alv[tr[i]-tl[i]].push_back(mp(tl[i],dt[i]));
arv[tr[i]-tl[i]].push_back(mp(tr[i],dt[i]));
}
int q=rd(),l,r,k;
for(int i=0;i<q;i++)
{
l=rd()-1;
r=rd();
k=rd()-1;
if(k==0)
{
ras[i*2]=fmx(l,r);
continue;
}
r--;
pii g=fd(l,r);
if(g.s-l>k) qr[k].push_back(mp(i*2,mp(l+k,g.s)));
else ras[i*2]=g.f;
if(r-g.s>=k) ql[k].push_back(mp(i*2+1,mp(g.s,r-k+1)));
else ras[i*2+1]=g.f;
}
bd(1,0,n);
for(int i=n;i>0;i--)
{
for(pii j:alv[i]) st(1,j.f,j.s);
for(piii j:ql[i]) ras[j.f]=ask(1,j.s.f,j.s.s);
}
bd(1,0,n);
for(int i=n;i>0;i--)
{
for(pii j:arv[i]) st(1,j.f,j.s);
for(piii j:qr[i]) ras[j.f]=ask(1,j.s.f,j.s.s);
}
for(int i=0;i<q;i++)
{
op(max(ras[i*2],ras[i*2+1]));
}
return 0;
}