#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int n,m,N=0,d[500010];
vector<int> e[500010],D[500010];
void dfs(int now,int fa)
{
N=max(N,d[now]);
D[d[now]].emplace_back(now);
for(int i=0;i<e[now].size();i++)
{
int t=e[now][i];
if(t==fa)
{
e[now].erase(e[now].begin()+i);
i--;
continue;
}
d[t]=d[now]+1;
dfs(t,now);
}
}
int f[500010],c[500010],len[500010];
int Find(int x)
{
return f[x]==x?x
:f[x]=Find(f[x]);
}
vector<pair<int,int> > E[500010],C[500010];
inline void init()
{
d[1]=1,dfs(1,1);
static vector<int> v[500010];
for(int i=1;i<=n;i++)
{
f[i]=c[i]=i,len[i]=1;
v[i].emplace_back(i);
}
for(int i=N;i;i--)
{
for(int j=0;j<D[i].size();j++)
{
int t=D[i][j],now=1;
for(int k=0;k<e[t].size();k++)
{
int x=Find(t),y=Find(e[t][k]);
if(v[c[x]].size()>v[c[y]].size())
{
swap(x,y);
}
int cx=c[x];
for(int l=0;l<v[cx].size();l++)
{
int t=v[cx][l];
if(f[t]==t&&c[t]==cx)
{
c[t]=c[y];
int l=len[t];
if(c[t+len[t]]==c[y])
{
E[i].push_back({t,t+len[t]});
f[t+len[t]]=t;
len[t]+=len[t+len[t]];
}
if(c[Find(t-1)]==c[y])
{
E[i].push_back({Find(t-1),t});
len[Find(t-1)]+=len[t];
t=f[t]=Find(t-1);
}
else
{
v[c[y]].emplace_back(t);
}
if(len[t]>l)
{
C[i].push_back({t,len[t]});
}
}
}
}
}
}
}
struct question
{
int l,r,k,id;
};
question q[500010];
int ans[500010],L[500010];
int num=0,tx[500010],ty[500010],td[500010],tl[500010];
int find(int x)
{
return f[x]==x
?x:find(f[x]);
}
inline void merge(int x,int y)
{
x=find(x),y=find(y);
if(d[x]>d[y])
{
swap(x,y);
}
num++;
tx[num]=x;
ty[num]=y;
td[num]=d[y];
tl[num]=L[y];
f[x]=y,len[y]+=len[x];
d[y]=max(d[y],d[x]+1);
L[y]=min(L[y],L[x]);
}
inline void del()
{
f[tx[num]]=tx[num];
d[ty[num]]=td[num];
L[ty[num]]=tl[num];
len[ty[num]]-=len[tx[num]];
num--;
}
int a[1<<20];
void add(int l,int r,int x,int v,int p)
{
a[p]=max(a[p],v);
if(l==r)
{
return;
}
int mid=l+r>>1;
x<=mid?add(l,mid,x,v,p<<1)
:add(mid+1,r,x,v,(p<<1)|1);
}
void clear(int l,int r,int x,int p)
{
a[p]=0;
if(l==r)
{
return;
}
int mid=l+r>>1;
x<=mid?clear(l,mid,x,p<<1)
:clear(mid+1,r,x,(p<<1)|1);
}
bool query(int l,int r,int ll,int rr,int k,int p)
{
if(r<ll||l>rr||a[p]<k)
{
return 0;
}
if(ll<=l&&r<=rr)
{
return 1;
}
int mid=l+r>>1;
return query(l,mid,ll,rr,k,p<<1)
||query(mid+1,r,ll,rr,k,(p<<1)|1);
}
void solve(int l,int r,int lq,int rq)
{
if(lq>rq||l==r)
{
for(int i=lq;i<=rq;i++)
{
ans[q[i].id]=l;
}
return;
}
int mid=l+r>>1,Num=num;
static vector<pair<int,int> > v;
v.clear();
for(int i=r;i>mid;i--)
{
for(int j=0;j<E[i].size();j++)
{
merge(E[i][j].first,E[i][j].second);
}
for(int j=0;j<C[i].size();j++)
{
add(1,n,C[i][j].first,C[i][j].second,1);
}
}
static bool mark[500010];
for(int i=lq;i<=rq;i++)
{
int l=q[i].l,r=q[i].r,k=q[i].k;
int t=find(l);
if(L[t]+len[t]-1>=l+k-1)
{
mark[i]=1;
continue;
}
mark[i]=query(1,n,l,r-k+1,k,1);
}
int p1=lq,p2=rq;
while(p1<=p2)
{
if(!mark[p1])
{
p1++;
continue;
}
if(mark[p2])
{
p2--;
continue;
}
swap(q[p1],q[p2]);
p1++,p2--;
}
for(int i=r;i>mid;i--)
{
for(int j=0;j<C[i].size();j++)
{
clear(1,n,C[i][j].first,1);
}
}
solve(l,mid,lq,p2);
while(num>Num)
{
del();
}
solve(mid+1,r,p1,rq);
}
void build(int l,int r,int p)
{
if(l==r)
{
a[p]=d[l];
return;
}
int mid=l+r>>1;
build(l,mid,p<<1);
build(mid+1,r,(p<<1)|1);
a[p]=max(a[p<<1],a[(p<<1)|1]);
}
int query(int l,int r,int ll,int rr,int p)
{
if(r<ll||l>rr)
{
return 0;
}
if(ll<=l&&r<=rr)
{
return a[p];
}
int mid=l+r>>1;
return max(query(l,mid,ll,rr,p<<1),
query(mid+1,r,ll,rr,(p<<1)|1));
}
int main()
{
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1,x,y;i<n;i++)
{
cin>>x>>y;
e[x].emplace_back(y);
e[y].emplace_back(x);
}
init();
cin>>m;
build(1,n,1);
int M=0;
for(int i=1,I=1;i<=m;i++,I++)
{
cin>>q[i].l>>q[i].r>>q[i].k;
if(q[i].k==1)
{
ans[I]=query(1,n,q[i].l,q[i].r,1);
i--,M++;
continue;
}
q[i].id=I;
}
for(int i=1;i<=n;i++)
{
f[i]=L[i]=i;
d[i]=len[i]=1;
}
memset(a,0,sizeof(a));
solve(1,N,1,m-M);
for(int i=1;i<=m;i++)
{
cout<<ans[i]<<'\n';
}
return 0;
}