#include<bits/stdc++.h>
// #define int long long
#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;
			// assert(!upd[pp.se].x);
			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);
	}
	// cout<<u<<" "<<tree[rt[u]]<<"\n";
}
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]));
	}
	// for(int u=1;u<n;u++){
		// assert(upd[u].l>=1),assert(upd[u].r<=n);
		// cout<<u<<" "<<dfn[u]<<" "<<upd[u].l<<" "<<upd[u].r<<" "<<upd[u].x<<"\n";
	// }
	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);
	
	// cerr<<(&mbe-&med)/1024.0/1024.0<<"\n";
	
	T=1;
	while(T--)work();
}