#include<bits/stdc++.h>
# define Maxn 500005
using namespace std;
int n,q,u,v,l,r,k;
int dep[Maxn],sz[Maxn],son[Maxn],top[Maxn],fa[Maxn],Mx;
int tot=1,head[Maxn];
struct Edge{
	int to,next;
}e[Maxn<<1];
struct Tree{
	int lca;
}tr[Maxn<<2];
int Max(int x,int y) {return x>=y ? x : y;}
void add(int u,int v)
{
	e[tot].to=v;e[tot].next=head[u];
	head[u]=tot++;
}
void dfs1(int rt,int F)
{
	int mx=-1;
	for(int i=head[rt];i;i=e[i].next)
	{
		if(e[i].to==F) continue;
		fa[e[i].to]=rt;dep[e[i].to]=dep[rt]+1;
		dfs1(e[i].to,rt);
		sz[rt]+=sz[e[i].to];
		if(mx<sz[e[i].to]) {mx=sz[e[i].to];son[rt]=e[i].to;}
	}sz[rt]++;
}
void dfs2(int rt,int t)
{
	top[rt]=t;
	if(son[rt]==0) return ;
	dfs2(son[rt],t);
	for(int i=head[rt];i;i=e[i].next)
	{
		if(e[i].to!=fa[rt]&&e[i].to!=son[rt])
		dfs2(e[i].to,e[i].to);
	}
}
int Lca(int x,int y)
{
	int f1=top[x],f2=top[y];
	while(f1!=f2)
	{
		if(dep[f1]<dep[f2]) {swap(x,y);swap(f1,f2);}
		x=fa[f1];f1=top[x];
	}
	if(dep[x]>dep[y]) swap(x,y);
	return x;
}
void build(int rt,int l,int r)
{
	if(l==r) {tr[rt].lca=l;return ;}
	int mid=(l+r)>>1;
	build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
	tr[rt].lca=Lca(tr[rt<<1].lca,tr[rt<<1|1].lca);
}
int query(int rt,int l,int r,int L,int R)
{
	if(L<=l&&r<=R) return tr[rt].lca;
	int mid=(l+r)>>1;
	if(L<=mid&&R>mid) return Lca(query(rt<<1,l,mid,L,R),query(rt<<1|1,mid+1,r,L,R));
	if(L<=mid) return query(rt<<1,l,mid,L,R);
	return query(rt<<1|1,mid+1,r,L,R);
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
//	freopen("my.out","w",stdout);
	scanf("%d",&n);dep[1]=1;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
	}dfs1(1,0);dfs2(1,1);
	build(1,1,n);
	scanf("%d",&q);
	while(q--)
	{
		scanf("%d%d%d",&l,&r,&k);Mx=0;
		for(int i=l;i<=r&&i+k-1<=r;i++)
		{
			int L=i,R=i+k-1;
			Mx=Max(Mx,dep[query(1,1,n,L,R)]);
		}
		printf("%d\n",Mx);
	}
	return 0;
}
