#include<bits/stdc++.h>
using namespace std;
const int _=5e5+5;
int a[_],c[_],d[20][_],f[20][_],s[_],p[_],o[_<<2],l[_],r[_],t,n,m,w[_];
vector<pair<int,int> >b[_],g[_<<1];
vector<int>e[_],h[_<<1],q[_];
void upd(int x,int l,int r,int p,int v){
	if(l==r){
		o[x]=max(o[x],v);
		return;
	}
	int mid=(l+r)>>1;
	if(p<=mid)upd(x<<1,l,mid,p,v);
	else upd(x<<1|1,mid+1,r,p,v);
	o[x]=max(o[x<<1],o[x<<1|1]);
}
int qry(int x,int l,int r,int ql,int qr){
	if(ql>qr)return 0;
	if(ql<=l&&r<=qr)return o[x];
	int mid=(l+r)>>1,res=0;
	if(ql<=mid)res=max(res,qry(x<<1,l,mid,ql,qr));
	if(qr>mid)res=max(res,qry(x<<1|1,mid+1,r,ql,qr));
	return res;
}
void dfs(int x,int fa){
	d[0][x]=d[0][fa]+1;f[0][x]=fa;
	for(int i=1;i<=18;i++)f[i][x]=f[i-1][f[i-1][x]];
	for(int y:e[x])
		if(y!=fa)dfs(y,x);
}
int lca(int x,int y){
	if(d[0][x]<d[0][y])swap(x,y);
	for(int i=18;~i;i--)
		if(d[0][f[i][x]]>=d[0][y])x=f[i][x];
	if(x==y)return x;
	for(int i=18;~i;i--)
		if(f[i][x]!=f[i][y])x=f[i][x],y=f[i][y];
	return f[0][x];
}
int gmx(int x,int y){
	int ln=c[y-x+1];
	return max(d[ln][x],d[ln][y-(1<<ln)+1]);
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=2,x,y;i<=n;i++){
		cin>>x>>y;c[i]=c[i>>1]+1;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0);
	for(int i=1;i<n;i++){
		p[i]=d[0][lca(i,i+1)];
		while(t&&p[s[t]]>=p[i])t--;
		a[i]=s[t];s[++t]=i;
	}
	t=0;
	for(int i=n-1;i;i--){
		while(t&&p[s[t]]>=p[i])t--;
		if(t)b[a[i]+1+n-s[t]].push_back({a[i]+1,p[i]}),g[a[i]+1+n-s[t]+n-1-(a[i]+1)].push_back({a[i]+1,p[i]});
		else b[a[i]+1].push_back({a[i]+1,p[i]}),g[a[i]+1+n-2-a[i]].push_back({a[i]+1,p[i]});
		s[++t]=i;
	}
	for(int i=1;i<=18;i++)
		for(int j=1;j+(1<<(i-1))<=n;j++)d[i][j]=max(d[i-1][j],d[i-1][j+(1<<(i-1))]);
	cin>>m;
	for(int i=1,x,y,z;i<=m;i++){
		cin>>x>>y>>z;
		if(z==1)w[i]=gmx(x,y);
		else l[i]=x,r[i]=y-z+1,q[n+1-z].push_back(i),h[n+1-z+n-1-l[i]].push_back(i);
	}
	for(int i=1;i<n;i++){
		for(pair<int,int> j:b[i])upd(1,1,n-1,j.first,j.second);
		for(int j:q[i])w[j]=qry(1,1,n-1,l[j],r[j]);
	}
	memset(o,0,sizeof(o));
	for(int i=1;i<n+n;i++){
		for(pair<int,int> j:g[i])upd(1,1,n-1,j.first,j.second);
		for(int j:h[i])w[j]=max(w[j],qry(1,1,n-1,1,l[j]-1));
	}
	for(int i=1;i<=m;i++)cout<<w[i]<<'\n';
	return 0;
}
