#include<bits/stdc++.h>
#define Ri register int
#define ci const int 
using namespace std;
const int N=5e5+15;
bool qbf;
int n,m,tot,dep[N],fa[N],aa[N],rt[N],ans[N],Id[N],D,L,R;
inline int cmpp(ci x,ci y){
	return dep[x]>dep[y];
}
struct qy{
	int l,r,k,id;
}q[N],q2[N];
inline int cmp2(const qy x,const qy y){
	return x.r-x.k<y.r-y.k;
}
inline int cmp3(const qy x,const qy y){
	return x.k>y.k;
}
inline int rd(){
	int ss=0;
	char sp=getchar();
	while(sp>57 || sp<48) sp=getchar();
	while(sp>=48 && sp<=57) ss=(ss<<3)+(ss<<1)+(sp^48),sp=getchar();
	return ss;
}
inline void out(ci x){
	if(x>9) out(x/10);
	putchar((x%10)^48);
}
struct sgt1{
	vector<int>A[N*4];
	int mx[N*4];
	inline void up(ci s){
		mx[s]=max(mx[s<<1],mx[s<<1|1]);
	}
	void upd(ci s,ci l,ci r,ci x,ci y){
		if(l==r){
			A[s].push_back(y);
			mx[s]=q[y].r-q[y].k;
			return ;
		}
		ci mid=(l+r)>>1;
		if(mid>=x) upd(s<<1,l,mid,x,y);
		else upd(s<<1|1,mid+1,r,x,y);
		up(s);
	}
	void qry(ci s,ci l,ci r){
		if(mx[s]<L-1) return ;
		if(l>R) return ;
		if(l==r){
			while(!A[s].empty()){
				int id=A[s].back();
				if(q[id].r-q[id].k>=L-1) ans[id]=max(ans[id],D),A[s].pop_back();
				else break;
			}
			if(!A[s].empty()) mx[s]=q[A[s].back()].r-q[A[s].back()].k;
			else mx[s]=0;
			return ;
		}
		ci mid=(l+r)>>1;
		qry(s<<1,l,mid);
		qry(s<<1|1,mid+1,r);
		up(s);
	}
}T1;
struct sgt2{
	vector<int>A[N*4];
	int PD[N*4],mi[N*4];
	void pr(){
		memset(PD,1,sizeof(PD));
		memset(mi,1,sizeof(mi));
	}
	inline void up(ci s){
		mi[s]=min(min(mi[s<<1],mi[s<<1|1]),PD[s]);
	}
	void upd(ci s,ci l,ci r,ci id){
		ci L=q[id].l+q[id].k-1,R=q[id].r;
		if(r<L || R<l) return ;
		if(L<=l && r<=R){
			A[s].push_back(id);
			PD[s]=q[id].k;
			up(s);
			return ;
		}
		ci mid=(l+r)>>1;
		upd(s<<1,l,mid,id);
		upd(s<<1|1,mid+1,r,id);
		up(s);
	}
	void qry(ci s,ci l,ci r){
		if(r<R || l>R || mi[s]>R-L+1) return ;
		if(PD[s]<=R-L+1){
			while(!A[s].empty()){
				int id=A[s].back();
				if(q[id].k<=R-L+1){
					ans[id]=max(ans[id],D);
					A[s].pop_back();
				}
				else break;
			}
			if(!A[s].empty()) PD[s]=q[A[s].back()].k;
			else PD[s]=n+1;
			up(s);			
		}
		if(l==r) return ;
		ci mid=(l+r)>>1;
		qry(s<<1,l,mid);
		qry(s<<1|1,mid+1,r);
		up(s);
	}
}T2;
struct eg{
	int to,nxt;
}e[N*2];
int cnt=2,h[N];
inline void add(ci u,ci v){
	e[cnt].to=v;
	e[cnt].nxt=h[u];
	h[u]=cnt++;
}
void dfs1(ci s){
	for(Ri i=h[s]; i!=0; i=e[i].nxt){
		int v=e[i].to;
		if(v==fa[s]) continue;
		fa[v]=s;
		dep[v]=dep[s]+1;
		dfs1(v);
	}
}
struct node{
	int ls,rs;
	int Llen,Rlen;
}tr[N*21];

inline void up(ci s,ci l,ci r){
	ci mid=(l+r)>>1;
	ci x=tr[s].ls,y=tr[s].rs;
	tr[s].Llen=tr[x].Llen,tr[s].Rlen=tr[y].Rlen;
	
	if(tr[x].Llen==mid-l+1) tr[s].Llen+=tr[y].Llen;
	if(tr[y].Rlen==r-mid) tr[s].Rlen+=tr[x].Rlen;
	
	if(tr[x].Rlen!=0 && tr[y].Llen!=0){
		L=mid-tr[x].Rlen+1,R=mid+tr[y].Llen;
		T1.qry(1,1,n);
		T2.qry(1,1,n);
	}
}
void upD(int &s,ci l,ci r,ci x){
	s=++tot;
	if(l==r){
		tr[s].Llen=tr[s].Rlen=1;
		return ;
	}
	ci mid=(l+r)>>1;
	if(mid>=x) upD(tr[s].ls,l,mid,x);
	else upD(tr[s].rs,mid+1,r,x);
	up(s,l,r);
}
int merGe(ci x,ci y,ci l,ci r){
	if(x==0 || y==0) return x|y;
	ci mid=(l+r)>>1;
	tr[x].ls=merGe(tr[x].ls,tr[y].ls,l,mid);
	tr[x].rs=merGe(tr[x].rs,tr[y].rs,mid+1,r);
	up(x,l,r);
	return x;
}
bool wtc;
int main(){
//	system("fc query4.ans query.out");
//	printf("%lf\n",(&wtc-&qbf)/1048576.0);
//	return 0;
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	T2.pr();
	n=rd();
	for(Ri i=1; i<n; ++i){
		int x=rd(),y=rd();
		add(x,y),add(y,x);
	}
	m=rd();
	for(Ri i=1; i<=m; ++i){
		q[i].l=rd(),q[i].r=rd(),q[i].k=rd();
		q[i].id=i;
		q2[i]=q[i];
	}
	sort(q2+1,q2+1+m,cmp2);
	for(Ri i=1; i<=m; ++i){
		T1.upd(1,1,n,q2[i].r,q2[i].id);
	}
	sort(q2+1,q2+1+m,cmp3);
	for(Ri i=1; i<=m; ++i){
		T2.upd(1,1,n,q2[i].id);
	}
	dep[1]=1;
	dfs1(1);
	for(Ri i=1; i<=n; ++i) Id[i]=i;
	sort(Id+1,Id+1+n,cmpp);
	for(Ri i=1; i<=n; ++i){
		int x=Id[i];
//		printf("? %d\n",x);
		D=dep[x];
		L=x,R=x;
		T1.qry(1,1,n);
		T2.qry(1,1,n);
		upD(rt[x],1,n,x);
		for(Ri j=h[x]; j!=0; j=e[j].nxt){
			int v=e[j].to;
			if(v==fa[x]) continue;
			rt[x]=merGe(rt[x],rt[v],1,n);
		}
	}
	for(Ri i=1; i<=m; ++i){
		out(ans[i]),putchar('\n');
	}
	return 0;
}
