#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int to[1000001],nxt[1000001],hd[500001],ec=0;
set<pair<int,int>>st[500001];
int dep[500001];
vector<tuple<int,int,int>>ops;
void add(int u,int vl,int vr)
{
auto&st=::st[u];
auto it=st.lower_bound({vl,vr});
if(it!=st.begin()&&prev(it)->second==vl-1)vl=prev(it)->first,st.erase(prev(it));
if(it!=st.end()&&it->first==vr+1)vr=it->second,st.erase(it);
ops.emplace_back(dep[u],vl,vr);
st.insert({vl,vr});
}
void dfs(int u,int f)
{
dep[u]=dep[f]+1;
add(u,u,u);
for(int i=hd[u];i;i=nxt[i])
{
int v=to[i];
if(v!=f)
{
dfs(v,u);
if(st[v].size()>st[u].size())swap(st[u],st[v]);
for(auto [l,r]:st[v])add(u,l,r);
st[v].clear();
}
}
}
struct tree
{
int tr[2000001];
int N;
void add(int u,int val)
{
u+=N;
for(;u;u>>=1)tr[u]=max(tr[u],val);
}
int query(int l,int r)
{
int res=0;
l+=N-1,r+=N+1;
for(;l^r^1;l>>=1,r>>=1)
{
if(~l&1)res=max(res,tr[l^1]);
if(r&1)res=max(res,tr[r^1]);
}
return res;
}
}tr[3];
main()
{
cin.tie(0)->sync_with_stdio(0);
#ifndef LOCAL
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
#endif
int n;
cin>>n;
for(int x=1;x<n;x++)
{
int u,v;
cin>>u>>v;
to[++ec]=v;
nxt[ec]=hd[u];
hd[u]=ec;
to[++ec]=u;
nxt[ec]=hd[v];
hd[v]=ec;
}
dfs(1,0);
int q;
cin>>q;
vector<int>ans(q);
for(int x=0;x<3;x++)
tr[x].N=2<<__lg(n+5);
vector<tuple<int,int,int,int>>query;
for(int x=0;x<q;x++)
{
int l,r,k;
cin>>l>>r>>k;
query.emplace_back(l,r,k,x);
}
sort(query.begin(),query.end(),[&](auto a,auto b){return get<2>(a)>get<2>(b);});
sort(ops.begin(),ops.end(),[&](auto a,auto b){return get<2>(a)-get<1>(a)>get<2>(b)-get<1>(b);});
int nl=0;
for(auto [l,r,k,id]:query)
{
while(nl<ops.size()&&get<2>(ops[nl])-get<1>(ops[nl])+1>=k)tr[1].add(get<1>(ops[nl]),get<0>(ops[nl])),tr[2].add(get<2>(ops[nl]),get<0>(ops[nl])),nl++;
ans[id]=max(tr[1].query(l,r-k+1),tr[2].query(l+k-1,r));
}
sort(query.begin(),query.end(),[&](auto a,auto b){return get<0>(a)<get<0>(b);});
sort(ops.begin(),ops.end(),[&](auto a,auto b){return get<1>(a)<get<1>(b);});
nl=0;
for(auto [l,r,k,id]:query)
{
while(nl<ops.size()&&get<1>(ops[nl])<=l)tr[0].add(get<2>(ops[nl]),get<0>(ops[nl])),nl++;
ans[id]=max(ans[id],tr[0].query(r,n));
}
for(int x=0;x<q;x++)
cout<<ans[x]<<endl;
}