#include<bits/stdc++.h>
using namespace std;
long long n,head[500010],cnt;
struct Edge
{
	long long nxt;
	long long v;
}edge[500010];
void add(long long u,long long v)
{
	cnt++;
	edge[cnt].nxt=head[u];
	edge[cnt].v=v;
	head[u]=cnt;
	return;
}
long long deep[500010],st[22][500010],lg[500010];
void DFS(long long x,long long fa)
{
	deep[x]=deep[fa]+1;
	for(int i=head[x];i;i=edge[i].nxt)
	{
		long long v=edge[i].v;
		if(v!=fa)
		{
			DFS(v,i);
		}
	}
	return;
}
long long ask(long long l,long long r)
{
	long long sum=r-l+1;
	return max(st[lg[sum]][l],st[lg[sum]][r-(1<<lg[sum])+1]);
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout); 
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		long long x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	DFS(1,0);
	for(int i=1;i<=n;i++)st[0][i]=deep[i];
	for(int i=1;i<=n;i++)
	{
		lg[i]=lg[i-1];
		if(1<<lg[i-1]+1==i)
		{
			lg[i]++;
		}
	}
	for(int i=1;i<=lg[n];i++)
	{
		for(int j=1;j<=n-(1<<i)+1;j++)
		{
			st[i][j]=max(st[i-1][j],st[i-1][j+(1<<(i-1))]);
		}
	}
	long long q;
	scanf("%lld",&q);
	for(int i=1;i<=q;i++)
	{
		long long l,r,k;
		scanf("%lld%lld%lld",&l,&r,&k);
		printf("%lld\n",ask(l,r));	
	}
	return 0;
}
