#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0;int f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x*f;
} 
const int N=5e5+10,mod=1e9+7;
int n,q;
int head[N],tot;
int dep[N],fa[N][22];
int ans,LC;
struct edge{
	int to,nxt;
}e[N*2];
void add(int u,int v){
	e[++tot]={v,head[u]};
	head[u]=tot;
}
void dfs(int u,int Fa){
	fa[u][0]=Fa;
	for(int i=1;i<=20;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
	dep[u]=dep[Fa]+1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==Fa)continue;
		dfs(v,u);
	}
}
int lca(int u,int v){
	if(dep[u]>dep[v]){
		swap(u,v);
	}
	for(int i=20;i>=0;i--)if(dep[fa[v][i]]>=dep[u])v=fa[v][i];
	if(u==v)return u;
	for(int i=20;i>=0;i--){
		if(fa[v][i]!=fa[u][i]){
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}
//void dfsA(int u){
//	dep[u]=dep[Fa]+1;
//	for(int i=head[u];i;i=e[i].nxt){
//		int v=e[i].to;
//		if(v==Fa)continue;
//		dfs(v,u);
//	}
//}
//void solveA(){
//	dfsA(1);
//}
struct seg{
	int val;
}tr[N*4];
void pushup(int p){
	tr[p].val=lca(tr[p<<1].val,tr[p<<1|1].val);
}
void build(int p,int l,int r){
	if(l==r){
		tr[p].val=l;return;	
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
void query(int p,int l,int r,int ql,int qr){
	if(l>qr||ql>r)return;
	if(ql<=l&&r<=qr){
		LC=lca(LC,tr[p].val);
		return;
	}
	int mid=l+r>>1;
	query(p<<1,l,mid,ql,qr);
	query(p<<1|1,mid+1,r,ql,qr);
}
void solve(){
	dfs(1,0);
//	printf("jk");
	build(1,1,n);
	q=read();
	for(int i=1;i<=q;i++){
		int l=read(),r=read(),k=read();
		ans=0,LC;
		for(int j=l;j<=r-k+1;j++){
			LC=j;
			query(1,1,n,j,j+k-1);
			ans=max(dep[LC],ans);
//			printf("%d %d %d %d\n",j,j+k-1,LC,dep[LC]);
		}
		printf("%d\n",ans);
	}
}
signed main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
//	if(n>=100000){
//		solveA();
//		return 0;
//	}
	solve();
	return 0;
} 
