#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<utility>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int N=5e5+4;
vector<int>e[N];
int n;
int sz[N],dep[N],f[N],son[N],top[N],lc[N*4],ans;
int L,R;
void dfs1(int now,int fa)
{
	f[now]=fa;
	dep[now]=dep[fa]+1;
	sz[now]=1;
	for(int i=0;i<e[now].size();i++)
	{
		int y=e[now][i];
		if(y==fa) continue;
		dfs1(y,now);
		sz[now]+=sz[y];
		if(sz[y]>sz[son[now]]) son[now]=y;
	}
}
void dfs2(int now,int tp)
{
//	printf("%d ",now);
	top[now]=tp;
	if(!son[now]) return;
	dfs2(son[now],tp);
	for(int i=0;i<e[now].size();i++)
	{
		int y=e[now][i];
		if(y==f[now]||y==son[now]) continue;
		dfs2(y,y);
	}
}
int lca(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=f[top[x]];
	}
	return dep[x]<dep[y]? x : y;
}
void pushup(int rt)
{
	lc[rt]=lca(lc[rt*2],lc[rt*2+1]);
}
void build_tree(int l,int r,int rt)
{
	if(l==r)
	{
		lc[rt]=l;
		return;
	}
	int mid=(l+r)/2;
	build_tree(l,mid,rt*2);
	build_tree(mid+1,r,rt*2+1);
	pushup(rt);
}
int query(int l,int r,int rt)
{
	if(l>=L&&r<=R)
	{
		return dep[lc[rt]];
	}
	if(l>R||r<L) 0;
	int mid=(l+r)/2;
	int s=0;
	if(L<=mid) s=max(s,query(l,mid,rt*2));
	if(R>mid) s=max(s,query(mid+1,r,rt*2+1));
	return s;
}
signed main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%lld%lld",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	
	dfs1(1,1);
	dfs2(1,1);
	
	build_tree(1,n,1);
	int q;
	L=3,R=4;
	scanf("%lld",&q);
	for(int i=1;i<=q;i++)
	{
		ans=0;
		int l,r,k;
		scanf("%lld%lld%lld",&l,&r,&k);
		if(l==1&&r==n&&k==r-l+1)
		{
			printf("1\n");
			continue;
		}
		for(int i=l;i+k-1<=r;i++)
		{
			int g=i;
			for(int j=i+1;j<=i+k-1;j++)
			{
				g=lca(g,j);
			}
			ans=max(ans,dep[g]);
			
		}
		printf("%lld\n",ans);
	}
	return 0;
	
}
/*
6
5 6
6 1
6 2
2 3
2 4
3
2 5 4
1 4 4
1 6 4

*/
