#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+15,L=21,M=5e3+15;
inline ll read(){
	ll x=0;char f=1,c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=0;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c-48),c=getchar();}
	return f?x:-x;
}
inline void ckmax(int&x,int y){if(y>x)x=y;}
int n,q,mxd,ecnt,bk,head[N],belong[N];
struct enode{int to,nxt;};
enode ed[N*2];
void add(int u,int v){
	ed[++ecnt]=enode{v,head[u]},head[u]=ecnt;
}
int tot,f[N],deg[N],in[N],out[N],dep[N],lg[N*2],arr[N*2],st[N*2][L];
int cmp(int p,int q){return dep[p]<dep[q]?p:q;}
void dfs(int u,int fa){
	f[u]=fa,dep[u]=dep[f[u]]+1;
	in[u]=++tot,arr[tot]=u;
	for(int v,i=head[u];i;i=ed[i].nxt){
		v=ed[i].to;
		if(v!=f[u]){
			dfs(v,u);
			arr[++tot]=u;
		}
	}
	out[u]=tot;
}
void init(){
	for(int i=tot;i>=1;--i){
		st[i][0]=arr[i];
		for(int j=1;j<L;++j){
			if(i+(1<<(j-1))<=tot){
				st[i][j]=cmp(st[i][j-1],st[i+(1<<(j-1))][j-1]);
			}else{
				st[i][j]=st[i][j-1];
			}
		}
	}
}
int lca(int x,int y){
	int l=min(in[x],in[y]),r=max(out[x],out[y]),nl=lg[r-l+1];
	return cmp(st[l][nl],st[r-(1<<nl)+1][nl]);
}
int ans[N],calc[M][M];
struct qnode{int id,l,r,k;};
qnode qry[N];
struct segment_tree{
	struct tnode{int l,r,x;};
	tnode t[N*4];
	#define ls (u<<1)
	#define rs (u<<1|1)
	#define mid ((t[u].l+t[u].r)>>1)
	void push_up(int u){
		t[u].x=lca(t[ls].x,t[rs].x);
	}
	void build(int u,int l,int r){
		t[u].l=l,t[u].r=r;
		if(l==r){
			t[u].x=l;
			return;
		}
		build(ls,l,mid),build(rs,mid+1,r);
		push_up(u);
	}
	int query(int u,int l,int r){
		if(t[u].l>=l&&t[u].r<=r){return t[u].x;}
		if(r<=mid){return query(ls,l,r);}
		if(l>mid){return query(rs,l,r);}
		return lca(query(ls,l,r),query(rs,l,r));
	}
	#undef ls
	#undef rs
	#undef mid
};
segment_tree t1;
inline bool cmpbk(qnode p,qnode q){
	return belong[p.l]!=belong[q.l]?p.l<q.l:((belong[p.l]&1)?(p.r<q.r):(p.r>q.r));
}
qnode tmp[N];
struct qtnode{int x,l1,r1;};
qtnode unify(int l,int mid,int r,qtnode p,qtnode q){
	qtnode res;
	if(p.l1==l-1){
		if(q.l1==mid){
			res.l1=p.l1;
		}else{
			res.l1=q.l1;
		}
	}else{
		res.l1=p.l1;
	}
	if(q.r1==r+1){
		if(p.r1==mid+1){
			res.r1=q.r1;
		}else{
			res.r1=p.r1;
		}
	}else{
		res.r1=q.r1;
	}
	res.x=max({p.x,q.x,q.l1-p.r1-1});
	res.x=max({res.x,res.l1-l,r-res.r1});
	return res;
}
vector<int>cd[N];
struct gap_segment_tree{
	struct tnode{
		int l,r;
		qtnode x;
	};
	tnode t[(N+15)*4];
	#define ls (u<<1)
	#define rs (u<<1|1)
	#define mid ((t[u].l+t[u].r)>>1)
	void push_up(int u){t[u].x=unify(t[u].l,mid,t[u].r,t[ls].x,t[rs].x);}
	void mdf(int u,int val){
		if(val==0){t[u].x={1,t[u].l-1,t[u].r+1};}
		else{t[u].x={0,t[u].l,t[u].r};}
	}
	void build(int u,int l,int r){
		t[u].l=l,t[u].r=r;
		if(l==r){
			mdf(u,0);
			return;
		}
		build(ls,l,mid),build(rs,mid+1,r);
		push_up(u);
	}
	void modify(int u,int target,int val){
		if(t[u].l==t[u].r){
			mdf(u,val);
			return;
		}
		if(target<=mid){modify(ls,target,val);}
		else{modify(rs,target,val);}
		push_up(u);
	}
	qtnode query(int u,int l,int r){
		if(t[u].l>=l&&t[u].r<=r){return t[u].x;}
		if(r<=mid){return query(ls,l,r);}
		if(l>mid){return query(rs,l,r);}
		return unify(max(l,t[u].l),mid,min(r,t[u].r),query(ls,l,r),query(rs,l,r));
	}
	#undef ls
	#undef rs
	#undef mid 
};
gap_segment_tree t2;
void sol(int L,int R,int l,int r){
	if(L>R||l>r){return;}
	int mid=((L+R)>>1);
	for(int i=L;i<=mid;++i){
		for(int u:cd[i]){t2.modify(1,u,1);}
	}
	int c1=l-1,c2=r+1;
	for(int i=l;i<=r;++i){
		if(t2.query(1,qry[i].l,qry[i].r).x>=qry[i].k){
			ans[qry[i].id]=mid,tmp[--c2]=qry[i];
		}else{
			tmp[++c1]=qry[i];
		}
	}
	for(int i=l;i<=r;++i){qry[i]=tmp[i];}
	sol(mid+1,R,c2,r);
	for(int i=L;i<=mid;++i){
		for(int u:cd[i]){t2.modify(1,u,0);}
	}
	sol(L,mid-1,l,c1);
}
int solve(){
	n=read();
	bool A=1,B=1;
	for(int u,v,i=1;i<=n-1;++i){
		u=read(),v=read();
		add(u,v),add(v,u);
		++deg[u],++deg[v];
		A&=(deg[u]<=2),A&=(deg[v]<=2);
	}
	dfs(1,0),init();
	q=read();
	for(int l,r,k,i=1;i<=q;++i){
		l=read(),r=read(),k=read();
		qry[i]={i,l,r,k};
		B&=(k==r-l+1);
	}
	if(n<=5000&&q<=5000){
		for(int u,i=1;i<=n;++i){
			calc[i][i]=u=i;
			for(int j=i-1;j>=1;--j){
				u=lca(u,j),calc[j][i]=u;
			}
		}
		for(int i=1;i<=q;++i){
			for(int l=qry[i].l,r=l+qry[i].k-1;r<=qry[i].r;++l,++r){
				ckmax(ans[qry[i].id],dep[calc[l][r]]);
			}
		}
	}else if(B){
		t1.build(1,1,n);
		for(int i=1;i<=q;++i){
			ans[qry[i].id]=dep[t1.query(1,qry[i].l,qry[i].r)];
		}
	}else if(A){
		t2.build(1,1,n);
		for(int i=1;i<=n;++i){
			cd[dep[i]].push_back(i);
			ckmax(mxd,dep[i]);
		}
		sol(1,mxd,1,q);
	}
	for(int i=1;i<=q;++i){
		printf("%d\n",ans[i]);
	}
	return 0;
}
/*
6
5 6
6 1
6 2
2 3
2 4
3
2 5 2
1 4 1
1 6 3

3 4 3
*/
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	int T=1;
	for(int mx=N*2,i=2;i<mx;++i){
		lg[i]=lg[i>>1]+1;
	}
	while(T--){
		solve();
		if(T!=0){printf("\n");}
	}
	return 0;
}
