#include<cstdio>
#include<iostream>
#define lc id<<1
#define rc id<<1|1
using namespace std;
int n,tot;
const int N=5e5+10;
int dep[N];
int tr[N<<4];
int head[N];
struct Edge
{
	int nxt,to;
}e[N<<1];
void add(int x,int y)
{
	e[++tot].to=y;
	e[tot].nxt=head[x];
	head[x]=tot;
	return;
}
void dfs(int c,int l)
{
	for(int i=head[c];i;i=e[i].nxt)
	{
		int d=e[i].to;
		if(d!=l)
		{
			dep[d]=dep[c]+1;
			dfs(d,c);
		}
	}
	return;
}
void build(int id,int l,int r)
{
	tr[id]=n;
	if(l==r) tr[id]=dep[l];
	else
	{
		int mid=l+r>>1;
		build(lc,l,mid);
		build(rc,mid+1,r);
		tr[id]=min(tr[lc],tr[rc]);
	}
	return;
}
int query(int id,int l,int r,int L,int R)
{
	if(L<=l&&r<=R) return tr[id];
	else
	{
		int mid=l+r>>1,ls=n,rs=n,res;
		if(L<=mid) ls=query(lc,l,mid,L,R);
		if(mid<R) rs=query(rc,mid+1,r,L,R);
		res=min(ls,rs);
		return res;
	}
	return 0;
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout); 
	int u,v,Q,l,r,k,ans;
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dep[1]=1;
	dfs(1,1);
	build(1,1,n);
	scanf("%d",&Q);
	while(Q--)
	{
		scanf("%d%d%d",&l,&r,&k);
		ans=query(1,1,n,l,r);
		printf("%d\n",ans);
	}
	return 0;
}
