#include<cstdio>
#include<algorithm>
#define N 514514
#define lc p<<1
#define rc p<<1|1
using namespace std;
int n,q;
int head[N],to[2*N],nxt[2*N],tot;
void add(int u,int v){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
int dep[N],f[N][20];
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	for(int i=1;i<20;i++)f[x][i]=f[f[x][i-1]][i-1];
	//printf("%d %d\n",x,fa);
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(y==fa)continue;
		dfs(y,x);
	}
}
int lca(int x,int y){
	if(x==-1)return y;
	if(y==-1)return x;
	if(dep[x]<dep[y])swap(x,y);
	//printf("%d %d\n",x,y);
	for(int i=19;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];//,printf("%d %d\n",x,y);
	if(x==y)return x;
	for(int i=19;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];//,printf("%d %d\n",x,y);
	return f[x][0];
}
struct Segment_tree{
	int l,r,x;
}s[N<<2];
void pushup(int p){
	s[p].x=lca(s[lc].x,s[rc].x);
}
void build(int p,int l,int r){
	s[p].l=l,s[p].r=r;
	if(l==r){
		s[p].x=l;
		return;
	} 
	build(lc,l,(l+r)/2);
	build(rc,(l+r)/2+1,r);
	pushup(p);
}
int query(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return -1;
	if(s[p].l>=l&&s[p].r<=r)return s[p].x;
	return lca(query(lc,l,r),query(rc,l,r));
}
signed main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	//printf("%d %d %d\n",lca(5,3),lca(3,4),lca(5,4));
	scanf("%d",&q);
	build(1,1,n);
	while(q--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		if(k==r-l+1)printf("%d\n",dep[query(1,l,r)]);
		else{
			int mx=0;
			for(int i=l;i+k-1<=r;i++){//keyishenmixiaoyouhua
				mx=max(mx,dep[query(1,i,i+k-1)]);
			}
			printf("%d\n",mx);
		}
	}
	return 0;
}
/*
6
5 6
6 1
6 2
2 3
2 4
3
2 5 2
1 4 1
1 6 3

*/
