#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,q;
vector<int> G[N];
struct Node{
int l,r,val;
}pnt[N*50],oqs[N];
int ppnt;
set<pair<int,int>> S[N];
void Insert(int d,int u,pair<int,int> now){
{
auto it=S[u].upper_bound(now);
if(it!=S[u].end()&&it->first==now.second+1){
now.second=it->second;
S[u].erase(it);
}
}
{
auto it=S[u].upper_bound(now);
if(it!=S[u].begin()){
--it;
if(it->second==now.first-1){
now.first=it->first;
S[u].erase(it);
}
}
}
pnt[++ppnt]={now.first,now.second,d};
S[u].insert(now);
}
void Merge(int d,int u,int v){
if(S[u].size()<S[v].size()) swap(S[u],S[v]);
for(pair<int,int> p:S[v]) Insert(d,u,p);
S[v].clear();
}
void DFS(int u,int f,int dep){
Insert(dep,u,{u,u});
for(int v:G[u]) if(v!=f){
DFS(v,u,dep+1);
Merge(dep,u,v);
}
}
struct Ques{
int x,y,val;
};
vector<Ques> opt[N],que[N];
namespace DS{
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((l+r)>>1)
int sgt[N*4];
void Up(int p){
sgt[p]=max(sgt[ls],sgt[rs]);
}
void Build(int p=1,int l=1,int r=n){
sgt[p]=0;
if(l==r) return ;
Build(ls,l,mid),Build(rs,mid+1,r);
}
void Modify(int x,int val,int p=1,int l=1,int r=n){
if(l==r){
sgt[p]=max(sgt[p],val);
return ;
}
if(x<=mid) Modify(x,val,ls,l,mid);
else Modify(x,val,rs,mid+1,r);
Up(p);
}
int Query(int L,int R,int p=1,int l=1,int r=n){
if(R<l||r<L) return 0;
if(L<=l&&r<=R) return sgt[p];
return max(Query(L,R,ls,l,mid),Query(L,R,rs,mid+1,r));
}
#undef ls
#undef rs
#undef mid
}
int ans[N];
void Work(){
cin>>n;
for(int i=1;i<n;++i){
int u,v; cin>>u>>v;
G[u].emplace_back(v);
G[v].emplace_back(u);
}
DFS(1,0,1);
cin>>q;
for(int i=1;i<=q;++i) cin>>oqs[i].l>>oqs[i].r>>oqs[i].val;
{
for(int i=1;i<=ppnt;++i) opt[pnt[i].r-pnt[i].l+1].emplace_back((Ques){pnt[i].r,pnt[i].r,pnt[i].val});
for(int i=1;i<=q;++i) que[oqs[i].val].emplace_back((Ques){oqs[i].l+oqs[i].val-1,oqs[i].r,i});
for(int i=n;i;--i){
for(Ques q:opt[i]) DS::Modify(q.x,q.val);
for(Ques q:que[i]) ans[q.val]=max(ans[q.val],DS::Query(q.x,q.y));
}
}
{
DS::Build();
for(int i=1;i<=n;++i) opt[i].clear(),que[i].clear();
}
{
for(int i=1;i<=ppnt;++i) opt[pnt[i].r-pnt[i].l+1].emplace_back((Ques){pnt[i].l,pnt[i].l,pnt[i].val});
for(int i=1;i<=q;++i) que[oqs[i].val].emplace_back((Ques){oqs[i].l,oqs[i].r-oqs[i].val+1,i});
for(int i=n;i;--i){
for(Ques q:opt[i]) DS::Modify(q.x,q.val);
for(Ques q:que[i]) ans[q.val]=max(ans[q.val],DS::Query(q.x,q.y));
}
}
{
DS::Build();
for(int i=1;i<=n;++i) opt[i].clear(),que[i].clear();
}
{
for(int i=1;i<=ppnt;++i) opt[pnt[i].r].emplace_back((Ques){pnt[i].l,pnt[i].l,pnt[i].val});
for(int i=1;i<=q;++i) que[oqs[i].r].emplace_back((Ques){1,oqs[i].l,i});
for(int i=n;i;--i){
for(Ques q:opt[i]) DS::Modify(q.x,q.val);
for(Ques q:que[i]) ans[q.val]=max(ans[q.val],DS::Query(q.x,q.y));
}
}
for(int i=1;i<=q;++i) printf("%d\n",ans[i]);
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
Work();
fclose(stdin),fclose(stdout);
return 0;
}