#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
struct Edge
{
	int nxt,to;
}edge[1000005];
int tot;
int head[500005];
void add(int from,int to)
{
	tot++;
	edge[tot].to=to;
	edge[tot].nxt=head[from];
	head[from]=tot;
}
int fa[22][500005];
int depth[500005];
void dfsinit(int now,int father,int dep)
{
	depth[now]=dep;
	fa[0][now]=father;
	for(int i=1;i<=20;i++)
	{
		fa[i][now]=fa[i-1][fa[i-1][now]];
	}
	for(int i=head[now];i;i=edge[i].nxt)
	{
		if(edge[i].to==father)
		continue;
		dfsinit(edge[i].to,now,dep+1);
	}
}
int LCA(int a,int b)
{
	if(depth[a]<depth[b])
	swap(a,b);
	for(int i=20;i>=0;i--)
	{
		if(depth[fa[i][a]]>=depth[b])
		a=fa[i][a];
	}
	if(a==b)
	return a;
	for(int i=20;i>=0;i--)
	{
		if(fa[i][a]!=fa[i][b])
		{
			a=fa[i][a];
			b=fa[i][b];
		}
	}
	return fa[0][a];
}
struct Seg
{
	int l,r,lca;
}seg[500005];
void build(int l,int r,int now)
{
	seg[now].l=l;
	seg[now].r=r;
	if(l==r)
	{
		seg[now].lca=l;
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,now*2);
	build(mid+1,r,now*2+1);
	seg[now].lca=LCA(seg[now*2].lca,seg[now*2+1].lca);
}
int query(int l,int r,int now)
{
	if(seg[now].l>=l&&seg[now].r<=r)
	return seg[now].lca;
	int res,flag=0;
	if(l<=seg[now*2].r)
	{
		flag=1;
		res=query(l,r,now*2);
	}
	if(r>=seg[now*2+1].l)
	{
		if(flag)
		res=LCA(res,query(l,r,now*2+1));
		else
		res=query(l,r,now*2+1);
	}
	return res;
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	int q;
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	scanf("%d",&q);
	dfsinit(1,0,1);
	build(1,n,1);
	for(int i=1;i<=q;i++)
	{
		int l,r,k;
		int maxn=0;
		scanf("%d%d%d",&l,&r,&k);
		for(int j=0;l+j+k-1<=r;j++)
		{
			maxn=max(depth[query(l+j,l+j+k-1,1)],maxn);
		}
		printf("%d\n",maxn);
	}
	return 0;
}
