#include<bits/stdc++.h>
#define mod 998244353ll
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mems(a,x) memset(a,x,sizeof(a))
using namespace std;
const int maxn=500010;
const int inf=1e18;
inline int read(){
int x=0,fl=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')fl=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch-'0');ch=getchar();}
return x*fl;
}
bool mbe;
int n,q;
int head[maxn],tot;
struct nd{
int nxt,to;
}e[maxn<<1];
void add(int u,int v){e[++tot]={head[u],v};head[u]=tot;}
int ll[maxn],rr[maxn],kk[maxn],ans[maxn];
#define mid (l+r>>1)
#define ls lc[nd]
#define rs rc[nd]
int tree[maxn*100],lc[maxn*100],rc[maxn*100];
int rt[maxn],idx;
void updata(int &nd,int l,int r,int p){
if(!nd)nd=++idx;tree[nd]++;
if(l==r)return ;
if(p<=mid)updata(ls,l,mid,p);
else updata(rs,mid+1,r,p);
}
int merge(int u,int v,int l,int r){
if(!u||!v)return u|v;
if(l==r)return u;
lc[u]=merge(lc[u],lc[v],l,mid);
rc[u]=merge(rc[u],rc[v],mid+1,r);
tree[u]=tree[lc[u]]+tree[rc[u]];
return u;
}
int fdl(int nd,int l,int r,int p){
if(!nd)return r;
if(tree[nd]==r-l+1)return -1;
if(l==r)return l;
if(p<=mid)return fdl(ls,l,mid,p);
int val=fdl(rs,mid+1,r,p);
if(val!=-1)return val;
return fdl(ls,l,mid,p);
}
int fdr(int nd,int l,int r,int p){
if(!nd)return l;
if(tree[nd]==r-l+1)return -1;
if(l==r)return l;
if(p>mid)return fdr(rs,mid+1,r,p);
int val=fdr(ls,l,mid,p);
if(val!=-1)return val;
return fdr(rs,mid+1,r,p);
}
int dep[maxn];
struct node{
int l,r,x;
}upd[maxn];
set<pii> s[maxn];
void ins(int u,pii p){
auto it=s[u].lower_bound(p);
pii del1,del2;
if(it!=s[u].end()){
pii pp=*it;
if(p.se==pp.fi-1){
int l=fdl(rt[u],0,n+1,p.fi)+1,r=fdr(rt[u],0,n+1,pp.se)-1;
upd[p.se]={l,r,dep[u]};
p.se=pp.se;
del1=pp;
}
}
if(it!=s[u].begin()){
it--;
pii pp=*it;
if(pp.se==p.fi-1){
int l=fdl(rt[u],0,n+1,pp.fi)+1,r=fdr(rt[u],0,n+1,p.se)-1;
upd[pp.se]={l,r,dep[u]};
p.fi=pp.fi;
del2=pp;
}
}
if(del1.fi)s[u].erase(del1);
if(del2.fi)s[u].erase(del2);
s[u].insert(p);
}
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa)continue;
dfs(v,u);rt[u]=merge(rt[u],rt[v],0,n+1);
}
updata(rt[u],0,n+1,u);
s[u].insert({u,u});
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(v==fa)continue;
if(s[v].size()>s[u].size())swap(s[u],s[v]);
for(pii p:s[v])ins(u,p);
}
}
int mx[20][maxn];
int quemx(int l,int r){
int k=__lg(r-l+1);
return max(mx[k][l],mx[k][r-(1<<k)+1]);
}
vector<int> id[maxn];
void modif(int &nd,int l,int r,int p,int w){
int lst=nd;nd=++idx;
tree[nd]=max(tree[lst],w),ls=lc[lst],rs=rc[lst];
if(l==r)return ;
if(p<=mid)modif(ls,l,mid,p,w);
else modif(rs,mid+1,r,p,w);
}
int query(int nd,int l,int r,int ql,int qr){
if(!nd||ql>qr)return 0;
if(l>=ql&&r<=qr)return tree[nd];
if(qr<=mid)return query(ls,l,mid,ql,qr);
if(ql>mid)return query(rs,mid+1,r,ql,qr);
return max(query(ls,l,mid,ql,qr),query(rs,mid+1,r,ql,qr));
}
void work(){
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v),add(v,u);
}
q=read();
for(int i=1;i<=q;i++)ll[i]=read(),rr[i]=read(),kk[i]=read();
dfs(1,0);
for(int i=1;i<=n;i++)mx[0][i]=dep[i];
for(int j=1;j<20;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
mx[j][i]=max(mx[j-1][i],mx[j-1][i+(1<<j-1)]);
}
}
for(int i=1;i<=q;i++)if(kk[i]==1){
ans[i]=max(ans[i],quemx(ll[i],rr[i]));
}
while(idx)tree[idx]=lc[idx]=rc[idx]=0,idx--;
for(int i=1;i<=n;i++)rt[i]=0;
for(int i=1;i<n;i++)id[upd[i].l].pb(i);
for(int i=1;i<=n;i++){
rt[i]=rt[i-1];
for(int j:id[i]){
modif(rt[i],1,n,upd[j].r,upd[j].x);
}
}
for(int i=1;i<=q;i++){
int l=ll[i],r=rr[i],k=kk[i];
ans[i]=max(ans[i],query(rt[l],1,n,l+k-1,n));
}
while(idx)tree[idx]=lc[idx]=rc[idx]=0,idx--;
for(int i=1;i<=n;i++)rt[i]=0;
for(int i=n;i;i--){
rt[i]=rt[i+1];
for(int j:id[i]){
modif(rt[i],1,n,upd[j].r,upd[j].x);
}
}
for(int i=1;i<=q;i++){
int l=ll[i],r=rr[i],k=kk[i];
ans[i]=max(ans[i],query(rt[r],1,n,1,r-k+1));
}
bool fl=1;for(int i=1;i<=q;i++)fl&=(kk[i]==rr[i]-ll[i]+1);
if(fl){
for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
return ;
}
while(idx)tree[idx]=lc[idx]=rc[idx]=0,idx--;
for(int i=1;i<=n;i++)rt[i]=0;
for(int i=1;i<=n;i++)id[i].clear();
for(int i=1;i<n;i++)id[upd[i].r-upd[i].l+1].pb(i);
for(int i=n;i;i--){
rt[i]=rt[i+1];
for(int j:id[i]){
modif(rt[i],1,n,upd[j].l,upd[j].x);
}
}
for(int i=1;i<=q;i++){
int l=ll[i],r=rr[i],k=kk[i];
ans[i]=max(ans[i],query(rt[k],1,n,l,r-k+1));
}
for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
}
bool med;
int T;
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
T=1;
while(T--)work();
}