#include<bits/stdc++.h>
#define fi first
#define se second
#define endl '\n'
#define si inline
using namespace std;
typedef long long ll;typedef __int128 li;typedef long double ld;
typedef unsigned long long ull;typedef pair<int,int> pii;typedef pair<ll,ll> pll;
typedef const int ci;typedef const ll cl;ci iinf=INT_MAX;cl linf=LLONG_MAX;
template<typename T>si bool gmax(T &x,const T y){if(x<y)return x=y,true;return false;}
template<typename T>si bool gmin(T &x,const T y){if(y<x)return x=y,true;return false;}
namespace LinkWish{
ci N=500005,M=2000005;
int n,m;
vector<int> e[N];
ci mmd=2500009;
int tot;
int head[mmd],nxt[M],val[M];
pii key[M];
si int tv(pii x){return (1ll*N*x.fi+x.se)%mmd;}
si void ins(pii x,int v){
int p=tv(x);
for(int i=head[p];i!=0;i=nxt[i])if(key[i]==x)return gmax(val[i],v),void();
tot++,nxt[tot]=head[p],val[tot]=v,key[tot]=x,head[p]=tot;
}
si void upd(int l,int r,int v){ins(pii(l,r),v);}
struct OP{
int l,r,d;
si OP(int x=0,int y=0,int z=0){l=x,r=y,d=z;}
si bool operator < (const OP obj){return r-l+1>obj.r-obj.l+1;}
}allq[N];
vector<OP> jqh;
int ans[N];
vector<OP> que[N],add[N];
struct Hoshino{
int ls,rs,lp,rp,l,r;
Hoshino(){ls=rs=0,lp=rp=0;}
si bool Full(){return lp==r&&rp==l;}
}t[N*40];
int rt[N],cnt;
int NowDep;
si void push_up(int x){
int lc=t[x].ls,rc=t[x].rs;
if(t[lc].rp!=0&&t[rc].lp!=0&&!t[lc].Full()&&!t[rc].Full())upd(t[lc].rp,t[rc].lp,NowDep);
if(lc!=0&&!t[lc].Full()&&t[lc].rp!=0&&t[rc].lp==0)upd(t[lc].rp,t[lc].r,NowDep);
if(rc!=0&&!t[rc].Full()&&t[rc].lp!=0&&t[lc].rp==0)upd(t[rc].l,t[rc].lp,NowDep);
if(lc!=0&&t[lc].Full()&&t[rc].lp!=0)t[x].lp=t[rc].lp;
else t[x].lp=t[lc].lp;
if(rc!=0&&t[rc].Full()&&t[lc].rp!=0)t[x].rp=t[lc].rp;
else t[x].rp=t[rc].rp;
}
void modify(int &x,int l,int r,int goal){
if(x==0)x=++cnt,t[x].l=l,t[x].r=r;
if(l==r)return t[x].lp=t[x].rp=l,void();
int mid=(l+r)>>1;
if(goal<=mid)modify(t[x].ls,l,mid,goal);
else modify(t[x].rs,mid+1,r,goal);
push_up(x);
}
int Merge(int x,int y,int l,int r){
if(x==0||y==0)return x+y;
if(l==r)assert(0);
int mid=(l+r)>>1;
t[x].ls=Merge(t[x].ls,t[y].ls,l,mid);
t[x].rs=Merge(t[x].rs,t[y].rs,mid+1,r);
push_up(x);
return x;
}
void dfs(int x,int fa,int d){
for(int to:e[x])if(to!=fa)dfs(to,x,d+1);
NowDep=d;
for(int to:e[x])if(to!=fa)rt[x]=Merge(rt[x],rt[to],1,n);
modify(rt[x],1,n,x);
if(t[rt[x]].lp!=0)upd(1,t[rt[x]].lp,d);
if(t[rt[x]].rp!=0)upd(t[rt[x]].rp,n,d);
}
struct Segg{
int mx[N<<2];
si int ls(int x){return x<<1;}
si int rs(int x){return x<<1|1;}
void build(int x,int l,int r){
mx[x]=0;
if(l==r)return ;
int mid=(l+r)>>1;
build(ls(x),l,mid),build(rs(x),mid+1,r);
}
void change(int x,int l,int r,int goal,int v){
if(l==r){
gmax(mx[x],v);
return ;
}
int mid=(l+r)>>1;
if(goal<=mid)change(ls(x),l,mid,goal,v);
else change(rs(x),mid+1,r,goal,v);
mx[x]=max(mx[ls(x)],mx[rs(x)]);
}
int ask(int x,int l,int r,int L,int R){
if(l>=L&&r<=R)return mx[x];
int mid=(l+r)>>1,res=0;
if(L<=mid)res=ask(ls(x),l,mid,L,R);
if(R>mid)gmax(res,ask(rs(x),mid+1,r,L,R));
return res;
}
}A,B;
struct Seg{
struct Set{
priority_queue<int> p,q;
si void ins(int x){p.push(x);}
si void era(int x){q.push(x);}
si int top(){
for(;!p.empty()&&!q.empty()&&p.top()==q.top();p.pop(),q.pop());
if(p.empty())return 0;
return p.top();
}
si void Clear(){
for(;!p.empty();p.pop());
for(;!q.empty();q.pop());
}
}val[N];
int mx[N<<2];
si int ls(int x){return x<<1;}
si int rs(int x){return x<<1|1;}
void build(int x,int l,int r){
mx[x]=0;
if(l==r)return val[l].Clear(),void();
int mid=(l+r)>>1;
build(ls(x),l,mid),build(rs(x),mid+1,r);
}
void change(int x,int l,int r,int goal,int v,bool type){
if(l==r){
if(type)val[l].era(v);
else val[l].ins(v);
mx[x]=val[l].top();
return ;
}
int mid=(l+r)>>1;
if(goal<=mid)change(ls(x),l,mid,goal,v,type);
else change(rs(x),mid+1,r,goal,v,type);
mx[x]=max(mx[ls(x)],mx[rs(x)]);
}
int ask(int x,int l,int r,int L,int R){
if(l>=L&&r<=R)return mx[x];
int mid=(l+r)>>1,res=0;
if(L<=mid)res=ask(ls(x),l,mid,L,R);
if(R>mid)gmax(res,ask(rs(x),mid+1,r,L,R));
return res;
}
}C;
void mian(){
cin>>n;
for(int i=1,x,y;i<n;i++)cin>>x>>y,e[x].push_back(y),e[y].push_back(x);
dfs(1,0,1);
for(int i=1;i<=tot;i++)jqh.emplace_back(key[i].fi,key[i].se,val[i]);
cin>>m;
for(int i=1,l,r,k;i<=m;i++){
cin>>l>>r>>k,allq[i]=OP(l,r,k);
que[k].emplace_back(l,r,i);
}
for(auto i:jqh)add[i.r-i.l+1].push_back(i);
A.build(1,1,n),B.build(1,1,n);
for(int i=n;i;i--){
for(auto j:add[i]){
A.change(1,1,n,j.l,j.d);
B.change(1,1,n,j.r,j.d);
}
for(auto j:que[i]){
ans[j.d]=max(A.ask(1,1,n,j.l,j.r-i+1),B.ask(1,1,n,j.l+i-1,j.r));
}
}
C.build(1,1,n);
for(int i=1;i<=n;i++)que[i].clear(),add[i].clear();
for(int i=1;i<=m;i++)que[allq[i].r].emplace_back(allq[i].l,allq[i].r,i);
for(auto i:jqh){
add[i.l].emplace_back(i.l,i.r,i.d);
add[i.r+1].emplace_back(i.l,i.r,-i.d);
}
for(int i=1;i<=n;i++){
for(auto j:add[i]){
if(j.d>0)C.change(1,1,n,j.l,j.d,false);
else C.change(1,1,n,j.l,-j.d,true);
}
for(auto j:que[i]){
gmax(ans[j.d],C.ask(1,1,n,1,j.l));
}
}
for(int i=1;i<=m;i++)cout<<ans[i]<<endl;
}
}
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
LinkWish::mian();
return 0;
}