#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int s=0,f=0;
	char cha;
	cha=getchar();
	while(!isdigit(cha)){
		f|=(cha=='-');
		cha=getchar();
	}
	while(isdigit(cha)){
		s=(s<<1)+(s<<3)+(cha^48);
		cha=getchar();
	}
	return f?-s:s;
}
const int maxn=5e5+10;
int f[maxn][32];
int n;
int head[maxn],nxt[maxn<<1],adj[maxn<<1];
int dep[maxn];
int tot,xx,yy;
int q;
int l,r,k;
int now;
int ans;
int mn[maxn][32];
int lg2[maxn];
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	for (int i=1;i<=30;i++){
		f[x][i]=f[f[x][i-1]][i-1];
	}
	for (int i=head[x];i;i=nxt[i]){
		int vj=adj[i];
		if (vj!=fa) dfs(vj,x);
	}
	return;
}
int lca(int x,int y){
	if (dep[x]<dep[y]) swap(x,y);
	for (int i=30;i>=0;i--){
		if (dep[f[x][i]]>=dep[y]) x=f[x][i];
	}
	if (x==y) return y;
	for (int i=30;i>=0;i--){
		if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	}
	return f[x][0]; 
}
void ins(int x,int y){
	adj[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
signed main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for (int i=1;i<n;i++){
		xx=read(),yy=read();
		ins(xx,yy),ins(yy,xx);
	}
	dfs(1,0);
		q=read();
		for (int i=1;i<=q;i++){
		l=read(),r=read(),k=read();
		ans=0;
		for (int j=l;j+k-1<=r;j++){
			if (k==1){
				ans=max(ans,dep[j]);
			}
			else{
				now=lca(j,j+1);
				for (int m=j+2;m<=j+k-1;m++){
					now=lca(now,m);
					if (now==1) break;
				}
			}
			ans=max(ans,dep[now]);
		}
		printf("%lld\n",ans);
		} 
	
	
}
