#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define ll long long
using namespace std;
int read(){
	int res=0,fg=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')fg=-1;c=getchar();}
	while(c>='0'&&c<='9')res=(res<<3)+(res<<1)+c-'0',c=getchar();
	return res*fg;
}
void write(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
const int maxn=5e5+5;
const int mod=1e9+7;
int n,m;
vector<int>G[maxn];
int dfn[maxn],st[20][maxn],dep[maxn],dcnt;
int ans[maxn],ql[maxn],qr[maxn],qk[maxn];
namespace lca{
	inline int mind(int x,int y){return dfn[x]<dfn[y]?x:y;}
	void dfs(int u,int f){
		dfn[u]=++dcnt;st[0][dfn[u]]=f;
		dep[u]=dep[f]+1;
		for(int v:G[u]){
			if(v==f)continue;
			dfs(v,u);
		}
	}
	int lca(int x,int y){
		if(x==y)return x;
		x=dfn[x],y=dfn[y];
		if(x>y)swap(x,y);
		int s=__lg(y-x++);
		return mind(st[s][x],st[s][y-(1<<s)+1]);
	}
	void init(){
		dfs(1,0);
		for(int i=1;(1<<i)<=n;i++){
			for(int j=1;j+(1<<i)-1<=n;j++){
				st[i][j]=mind(st[i-1][j],st[i-1][j+(1<<i-1)]);
			}
		}
	}
}

namespace sgt{
	struct node{
		int lmax,rmax,tmax,sum;
		friend node operator+(node x,node y){
			node res;
//			res.lmax=max(x.lmax,x.sum+y.lmax);
//			res.rmax =max(y.rmax,y.sum+x.rmax);
//			res.tmax=max(max(x.tmax,y.tmax),x.rmax+y.lmax);
//			res.sum =x.sum+y.sum;
			res.lmax=max(x.lmax,(y.lmax+x.sum)*(x.sum==x.lmax));
			res.rmax=max(y.rmax,(x.rmax+y.sum)*(y.sum==y.rmax));
			res.tmax=max(max(x.tmax,y.tmax),(x.rmax+y.lmax)*(x.rmax&&y.lmax));
			res.sum =x.sum+y.sum;
			return res;
		}
	}tr[maxn<<2];
	#define ls x<<1
	#define rs x<<1|1
	void push_up(int x){tr[x]=tr[ls]+tr[rs];}
	void upd_set(int x,int l,int r,int nx,int k){
//		cerr<<nx<<' '<<l<<' '<<r<<endl;
		if(l==r){tr[x]={k,k,k,1};return;}//ÈýK´øµ¥A,Ë­Òª£¿ 
		int mid=l+r>>1;
		if(nx<=mid)upd_set(ls,l,mid,nx,k);
		if(nx>mid)upd_set(rs,mid+1,r,nx,k);
		push_up(x);
	}
	node query(int x,int l,int r,int nl,int nr){
		if(nl<=l&&r<=nr)return tr[x];
		int mid=l+r>>1;
		if(nr<=mid)return query(ls,l,mid,nl,nr);
		if(nl>mid)return query(rs,mid+1,r,nl,nr);
		return query(ls,l,mid,nl,nr)+query(rs,mid+1,r,nl,nr);
	}
	void build(int x,int l,int r){
		if(l==r){tr[x]={0,0,0,1};return;}
		int mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		push_up(x);
	}
}
namespace solve2{
	int tr[maxn<<2];
	#define ls x<<1
	#define rs x<<1|1
	void push_up(int x){tr[x]=max(tr[ls],tr[rs]);}
	void build(int x,int l,int r){
		if(l==r){tr[x]=dep[l];return;}
		int mid=l+r>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		push_up(x);
	}
	int query(int x,int l,int r,int nl,int nr){
		if(nl<=l&&r<=nr)return tr[x];
		int mid=l+r>>1;
		if(nr<=mid)return query(ls,l,mid,nl,nr);
		if(nl>mid)return query(rs,mid+1,r,nl,nr);
		return max(query(ls,l,mid,nl,nr),query(rs,mid+1,r,nl,nr));
	}
	void solve(){
		build(1,1,n);
		for(int i=1;i<=m;i++){
			if(qk[i]==1)ans[i]=query(1,1,n,ql[i],qr[i]);
		}
	}
}
namespace solve1{
	int id[maxn],now=0,qwq[maxn];
	bool cmp(int x,int y){return qwq[x]>qwq[y];}
	void move(int x){
		while(now<x){++now;sgt::upd_set(1,1,n-1,id[now],1);}
		while(now>x){sgt::upd_set(1,1,n-1,id[now],0);now--;}
	}
	void calc(vector<int> que,int l,int r){
		if(l>r||que.empty() )return;
		if(qwq[id[l]]==qwq[id[r]]){for(int x:que)ans[x]=qwq[id[l]];return ;}
		int mid=l+r>>1;
//		cerr<<l<<' '<<r<<endl;
		move(mid);
		vector<int>quel,quer;
		for(int x:que){
			if(sgt::tr[1].tmax<qk[x]-1)quer.push_back(x);
			else if(sgt::query(1,1,n-1,ql[x],qr[x]-1).tmax>=qk[x]-1)quel.push_back(x);
			else quer.push_back(x); 
		}
		calc(quel,l,mid);
		calc(quer,mid+1,r);
	}
	void solve(){
		sgt::build(1,1,n-1);
		for(int i=1;i<n;i++)qwq[i]=dep[lca::lca(i,i+1)];
		for(int i=1;i<n;i++)id[i]=i;
		sort(id+1,id+n,cmp);
		vector<int>tmp;
		for(int i=1;i<=m;i++){
//			if(qk[i]<=1)continue;
//			for(int l=ql[i];l+qk[i]-1<=qr[i];l++){
//				int tmp=n;
//				for(int j=l;j-l<qk[i]-1;j++){
//					tmp=min(tmp,qwq[j]);
//				}
//				ans[i]=max(ans[i],tmp);
//			}
			if(qk[i]>1)tmp.push_back(i);
		}
		calc(tmp,1,n-1);
	}
}
void solve(){
	n=read();
	for(int i=1;i<n;i++){
		int x=read(),y=read();
		G[x].push_back(y);
		G[y].push_back(x);
	}
	m=read();
	for(int i=1;i<=m;i++)ql[i]=read(),qr[i]=read(),qk[i]=read();
	lca::init();
//	cerr<<"ok"<<endl;
	solve1::solve();
	solve2::solve();
	for(int i=1;i<=m;i++)write(ans[i]),putchar('\n');
//	int x=read();
//	for(int i=1;i<=m;i++){
//		int x=read();
//		if(x!=ans[i]){
//			cerr<<i<<' '<<ql[i]<<' '<<qr[i]<<' '<<qk[i]<<endl;
//		}
//	}
}
signed main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	int T=1;
	while(T--)solve();
	return 0;
}
