#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,u,v,q,l,r,k,cnt,head[N],dep[N],f[N][23],ma;
struct Edge
{
	int v,next;
}e[N];
void add(int x,int y)
{
	e[++cnt].v=y;
	e[cnt].next=head[x];
	head[x]=cnt;
}
void dfs(int x,int fa)
{
	dep[x]=dep[fa]+1;
	for(int i=head[x];i;i=e[i].next)
	{
		int y=e[i].v;
		if(y==fa) continue;
		f[y][0]=x;
		for(int j=1;(1<<j)<=dep[x];j++) f[y][j]=f[f[y][j-1]][j-1];
		dfs(y,x);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=21;i>=0;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(int i=21;i>=0;i--)
	{
		if(dep[f[x][i]]!=dep[f[y][i]])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
bool check(int x,int l,int r,int k)
{
	int len=0,ml=0;
	for(int i=l;i<=r;i++)
	{
		if(dep[i]>=x) len++;
		else
		{
			ml=max(ml,len);
			len=0;
		}
	}
	ml=max(ml,len);
	return ml>=k;
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	scanf("%d",&q);
	while(q--)
	{
		ma=0;
		scanf("%d%d%d",&l,&r,&k);
		if(n<=5000)
		{
			for(int i=l;i<=r;i++)
			{
				int zuo=i,you=i+k-1,kt=i;
				if(you>r) break;
				for(int j=zuo+1;j<=you;j++) kt=lca(kt,j);
				ma=max(ma,dep[kt]);
			}
			printf("%d\n",ma);
		}
		else
		{
			int zuo=1,you=n,ans=0;
			while(zuo<=you)
			{
				int mid=(zuo+you)/2;
				if(check(mid,l,r,k))
				{
					ans=max(ans,mid);
					zuo=mid+1;
				}
				else you=mid-1;
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}
