#include<bits/stdc++.h>
using namespace std;

int n,q;

//int head[500001],head_top;
//struct node
//{
//	int from;
//	int to;
//	int next;
//	void add(int addf,int addt,node g[])
//	{
//		g[head_top].next=head[addf];
//		g[head_top].from=addf;
//		g[head_top].to=addt;
//		head[addf]=head_top;
//	}
//};
//node edge[1000001];


//int vist[500001],dep[500001],f[500001];
//void dfs(int pre,int addr,int depth)
//{
//	f[addr]=pre;
//	vist[addr]=1;
//	dep[addr]=depth;
//	for(int i=head[addr];i;i=edge[i].next)
//	{
//		if(!vist[edge[i].to])
//		{
//			dfs(edge[i].from,edge[i].to,depth+1);	
//		}
//	}
//}
bool vist[500001];
int dep[500001];
vector<int> g[500001];


int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
//		edge[++head_top].add(u,v,edge);
//		edge[++head_top].add(v,u,edge);
	}
	
	dep[1]=1;
	vist[1]=1;
	int it=1;
	for(int j=0;j<g[it].size();)
	{
		if(!vist[g[it][j]])
		{
			dep[g[it][j]]=dep[it]+1;
			it=g[it][j];
			vist[it]=1;
			j=0;
		}
		else j++;
	}
	
	//dfs(0,1,1);
	//build_st();
	scanf("%d",&q);
	while(q--)
	{
		int ans=0;
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
	
		for(int i=l;i+k-1<=r;i++)
		{
			int lca=1e7;
			for(int j=i;j<=i+k-1;j++)
			{
				lca=min(lca,dep[j]);
			}
			ans=max(ans,lca);
		}
		printf("%d\n",ans);
	}
	
	return 0;
}
