#include<bits/stdc++.h>
using namespace std;
namespace Solve{
typedef long long ll;
const int N=500010;
int n,q;
int head[N],ver[N<<1],ne[N<<1],idx=2;
void add(int x,int y){
ver[idx]=y,ne[idx]=head[x],head[x]=idx++;
}
struct Ques{
int l,r,k,ans;
}qs[N];
int ff[N],dep[N],siz[N],son[N];
void dfs1(int x,int fa){
ff[x]=fa,dep[x]=dep[fa]+1,siz[x]=1;
for(int i=head[x];i;i=ne[i])
if(ver[i]!=fa){
dfs1(ver[i],x);
siz[x]+=siz[ver[i]];
if(siz[ver[i]]>siz[son[x]])son[x]=ver[i];
}
}
int tpf[N];
void dfs2(int x,int topf){
tpf[x]=topf;
if(son[x])dfs2(son[x],topf);
for(int i=head[x];i;i=ne[i])
if(!tpf[ver[i]])dfs2(ver[i],ver[i]);
}
int LCA(int x,int y){
while(tpf[x]!=tpf[y]){
if(dep[tpf[x]]<dep[tpf[y]])swap(x,y);
x=ff[tpf[x]];
}
if(dep[x]<dep[y])return x;
return y;
}
vector<int>mg[N];
int L[N],R[N];
struct S{
int l,r,v;
}s[N+N];int tot;
struct Seg{
struct Node{
int l,r;
int mx;
}tr[N<<2];
void build(int p,int l,int r){
tr[p].l=l,tr[p].r=r,tr[p].mx=0;
if(l==r)return;
int mid=(l+r)>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
}
void change(int p,int x,int y){
tr[p].mx=max(tr[p].mx,y);
if(tr[p].l==tr[p].r)return;
if(x<=tr[p<<1].r)change(p<<1,x,y);
else change(p<<1|1,x,y);
}
int query(int p,int l,int r){
if(l<=tr[p].l&&tr[p].r<=r)return tr[p].mx;
int res=0;
if(l<=tr[p<<1].r)res=query(p<<1,l,r);
if(r>=tr[p<<1|1].l)res=max(res,query(p<<1|1,l,r));
return res;
}
}seg;
vector<int>cg[N],qr[N];
void main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
add(x,y),add(y,x);
}
cin>>q;
for(int i=1;i<=q;i++)cin>>qs[i].l>>qs[i].r>>qs[i].k;
dfs1(1,0),dfs2(1,1);
for(int i=1;i<n;i++){
int z=LCA(i,i+1);
mg[dep[z]].push_back(i);
}
for(int i=1;i<=n;i++)L[i]=R[i]=i;
for(int i=1;i<=n;i++)s[++tot]=(S){i,i,dep[i]};
for(int i=n;i;i--){
for(int j:mg[i]){
R[L[j]]=R[j+1];
L[R[j+1]]=L[j];
s[++tot]=(S){L[j],R[j+1],i};
}
}
seg.build(1,1,n);
for(int i=1;i<=q;i++)qr[qs[i].l].push_back(i),qr[qs[i].r-qs[i].k+1].push_back(i);
for(int i=1;i<=tot;i++)cg[s[i].l].push_back(i);
for(int i=1;i<=n;i++){
for(int j:cg[i]){
seg.change(1,s[j].r,s[j].v);
}
for(int j:qr[i]){
if(i==qs[j].l){
qs[j].ans=max(qs[j].ans,seg.query(1,i+qs[j].k-1,n));
}
else{
qs[j].ans=max(qs[j].ans,seg.query(1,qs[j].r,n));
}
}
}
for(int i=0;i<=n;i++)qr[i].clear(),cg[i].clear();
seg.build(1,1,n);
for(int i=1;i<=q;i++)qr[qs[i].k].push_back(i);
for(int i=1;i<=tot;i++)cg[s[i].r-s[i].l+1].push_back(i);
for(int i=n;i;i--){
for(int j:cg[i]){
seg.change(1,s[j].l,s[j].v);
}
for(int j:qr[i]){
qs[j].ans=max(qs[j].ans,seg.query(1,qs[j].l,qs[j].r-qs[j].k+1));
}
}
for(int i=0;i<=n;i++)qr[i].clear(),cg[i].clear();
for(int i=1;i<=q;i++){
cout<<qs[i].ans<<'\n';
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
Solve::main();
return 0;
}