#include <bits/stdc++.h>
using namespace std;
inline char gc(){
	static char buf[1<<21],*p1=buf,*p2=buf;
	if(p2==p1) p2=(p1=buf)+fread(buf,1,1<<20,stdin);
	return *p1++;
}
inline int read(){
	int x=0; char c=gc();
	for(;c<'0'||c>'9';c=gc());
	for(;c>='0'&&c<='9';c=gc())x=(x*10)+(c^48);
	return x;
}
const int N=5e5+10;
int n;
vector<int> g[N];
int dfn[N],ord[N],fa[N],dep[N],dfcnt;
void dfs(int u,int f){
	dep[u]=dep[f]+1;
	dfn[u]=++dfcnt;
	ord[dfcnt]=u;
	fa[u]=f;
	for(int v:g[u]) if(v!=f) dfs(v,u);
}
int st[21][N];
int choose(int x,int y){
	return dep[x]<dep[y]?x:y;
}
void init_st(){
	for(int i=1;i<=n;i++) st[0][i]=ord[i];
	for(int j=1;j<=20;j++){
		auto F=st[j],G=st[j-1];
		for(int i=1;i<=n-(1<<j)+1;i++){
			F[i]=choose(G[i],G[i+(1<<j>>1)]);
		}
	}
}
int qst(int l,int r){
	int len=__lg(r-l+1);
	return choose(st[len][l],st[len][r-(1<<len)+1]);
}
int lca(int u,int v){
	if(dfn[u]>dfn[v]) swap(u,v);
	int lc=qst(dfn[u],dfn[v]);
	if(lc==u) return u;
	else return fa[lc];
}
struct MINDEP{
	int st[21][N];
	void init_st(){
		for(int i=1;i<=n;i++) st[0][i]=dep[i];
		for(int j=1;j<=20;j++){
			auto F=st[j],G=st[j-1];
			for(int i=1;i<=n-(1<<j)+1;i++){
				F[i]=max(G[i],G[i+(1<<j>>1)]);
			}
		}
	}
	int qst(int l,int r){
		int len=__lg(r-l+1);
		return max(st[len][l],st[len][r-(1<<len)+1]);
	}
}mindep;
int a[N];
int lef[N],rit[N];
int stk[N],top;
struct MINDEP2{
	int st[21][N];
	void init_st(){
		for(int i=1;i<=n;i++) st[0][i]=a[i];
		for(int j=1;j<=20;j++){
			auto F=st[j],G=st[j-1];
			for(int i=1;i<=n-(1<<j)+1;i++){
				F[i]=min(G[i],G[i+(1<<j>>1)]);
			}
		}
	}
	int qst(int l,int r){
		int len=__lg(r-l+1);
		return min(st[len][l],st[len][r-(1<<len)+1]);
	}
}minlc;
struct BIT{
	// premax
	int t[N];
	int h[N],hc;
	void c(int x,int d){
//		printf("c %d %d\n",x,d);
		assert(x); h[++hc]=x; for(;x<N;x+=x&-x) t[x]=max(t[x],d);
	}
	int q(int x){ 
//		printf("q %d\n",x);
		int r=0; for(;x;x-=x&-x) r=max(r,t[x]); return r;
	}
	void clr(){
//		puts("cle");
		for(int i=1;i<=hc;i++){
			for(int x=h[i];x<N;x+=x&-x) t[x]=0;
		}
		hc=0;
	}
}T;
int ans[N];
void solve(int l,int r,vector<array<int,3>>& C,vector<array<int,4>>& Q){
	if(C.empty()||Q.empty()) return ;
	vector<array<int,3>> cl,cr;
	vector<array<int,4>> ql,qr;
//	cl.reserve(C.size()/2);
//	cr.reserve(C.size()/2);
//	ql.reserve(Q.size()/2);
//	qr.reserve(Q.size()/2);
	int mid=(l+r)>>1;
	for(auto p:C) {
		if(p[1]-p[0]+1>mid) cr.push_back(p);
		else cl.push_back(p);
	}
	vector<array<int,4>> cur;
	for(auto p:Q){
//		printf("[%d %d %d %d]\n",p[0],p[1],p[2],p[3]);
		if(p[2]<=l){
			// to be ans
			cur.push_back(p);
		}else if(p[2]<=mid){
//			puts("!@!!");
			ql.push_back(p);
			qr.push_back(p);
		}else{
			qr.push_back(p);
		}
	}
	sort(cur.begin(),cur.end(),[&](const auto& x,const auto& y){ return x[0]>y[0]; });
	sort(C.begin(),C.end(),[&](const auto& x,const auto& y){ return x[0]>y[0]; });
	int now=0;
//	printf("solve %d %d cur.siz=%d\n",l,r,C.size());
	T.clr();
	for(auto p:C){
		while(now!=cur.size()&&p[0]<cur[now][0]){
			auto q=cur[now];
			ans[q[3]]=max(ans[q[3]],T.q(q[1]));
//			printf("-> %d\n",q[3]);
			now++;
		}
		T.c(p[1],p[2]);
	}
	while(now!=cur.size()){
		auto q=cur[now];
		ans[q[3]]=max(ans[q[3]],T.q(q[1]));
		now++;
	}
	if(l!=r){
		solve(l,mid,cl,ql);
		solve(mid+1,r,cr,qr);
	}
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for(int i=1;i<n;i++){
		int u,v;
		u=read(); v=read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,1);
	init_st();
	mindep.init_st();
	for(int i=1;i<n;i++){
		a[i]=dep[lca(i,i+1)];
	}
	for(int i=1;i<n;i++){
		while(a[stk[top]]>=a[i]) top--;
		lef[i]=stk[top]+1;
		stk[++top]=i;
	}
	top=1;
	stk[top]=n;
	for(int i=n-1;i>=1;i--){
		while(a[stk[top]]>=a[i]) top--;
		rit[i]=stk[top];
		stk[++top]=i;
	}
	vector<array<int,3>> c1,c2;
	for(int i=1;i<n;i++){
//		printf("%d %d %d\n",lef[i],rit[i],a[i]);
		c1.push_back({lef[i],rit[i],a[i]});
		c2.push_back({rit[i],lef[i],a[i]});
	}
	sort(c1.begin(),c1.end());
	sort(c2.begin(),c2.end());
	c1.resize(unique(c1.begin(),c1.end())-c1.begin());
	c2.resize(unique(c2.begin(),c2.end())-c2.begin());
	vector<array<int,4>> q1,q2;
	minlc.init_st();
	int m=read();
	for(int i=1;i<=m;i++){
		int l,r,k;
		l=read(); r=read(); k=read();
		if(k==1){
			ans[i]=mindep.qst(l,r);
			continue;
		}
		if(k==r-l+1){
			ans[i]=minlc.qst(l,r-1);
		}
		q1.push_back({l,r,k,i});
		q2.push_back({l+k-1,l,1,i});
		q2.push_back({r,r-k+1,1,i});
	}
	solve(1,n,c1,q1);
	solve(1,1,c2,q2);
	for(int i=1;i<=m;i++){
		printf("%d\n",ans[i]);
	}
}
