#include<bits/stdc++.h>
using namespace std;
int n,t,ql,L[710],R[710],pos[500010],fr[500010],son[500010],lc[710],dep[500010];
int l,h[500010],x,y,siz[500010],f[500010],m,k,s;
struct edge
{
	int v,next;
}e[1000010];
inline void add(int x,int y)
{
	e[++l].v=y;
	e[l].next=h[x];
	h[x]=l;
}
inline void dfs(int u,int fa)
{
	dep[u]=dep[fa]+1;
	f[u]=fa;
	siz[u]=1;
	for(int i=h[u];i;i=e[i].next)
	{
		if(e[i].v==fa) continue;
		dfs(e[i].v,u);
		siz[u]+=siz[e[i].v];
		if(siz[son[u]]<siz[e[i].v]) son[u]=e[i].v;
	}
}
inline void divide(int u,int fa,int fi)
{
	fr[u]=fi;
	if(son[u]) divide(son[u],u,fi);
	for(int i=h[u];i;i=e[i].next)
	{
		if(e[i].v==fa||e[i].v==son[u]) continue;
		divide(e[i].v,u,e[i].v);
	}
}
inline int LCA(int x,int y)
{
	while(fr[x]!=fr[y])
	{
		if(dep[fr[x]]<dep[fr[y]]) swap(x,y);
		x=f[fr[x]];
	}
	if(dep[x]<dep[y]) swap(x,y);
	return y;
}
inline void build()
{
	ql=sqrt(n);
	t=n/ql;
	for(int i=1;i<=t;i++)
	{
		L[i]=R[i-1]+1;
		R[i]=i*ql;
	}
	if(R[t]!=n)
	{
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;i++)
	{
		for(int j=L[i];j<=R[i];j++) pos[j]=i;
		lc[i]=L[i];
		for(int j=L[i]+1;j<=R[i];j++)
		{
			if(lc[i]==1) break;
			lc[i]=LCA(lc[i],j);
		}
	}
}
inline int ask(int l,int r)
{
	int q=pos[l],p=pos[r],ans=l;
	if(q==p)
	{
		for(int i=l+1;i<=r;i++)
		{
			if(ans==1) break;
			ans=LCA(ans,i);
		}
		return ans;
	}
	for(int i=l+1;i<=R[q];i++)
	{
		if(ans==1) break;
		ans=LCA(ans,i);
	}
	for(int i=L[p];i<=r;i++)
	{
		if(ans==1) break;
		ans=LCA(ans,i);
	}
	for(int i=q+1;i<p;i++)
	{
		if(ans==1) break;
		ans=LCA(ans,lc[i]);
	}
	return ans;
}
signed main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		scanf("%d %d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs(1,0);
	divide(1,0,1);
	build();
	scanf("%d",&m);
	while(m--)
	{
		scanf("%d %d %d",&x,&y,&k);
		s=0;
		for(int i=x;i<=y;i++)
		{
			if(i+k-1>y) break;
			s=max(s,dep[ask(i,i+k-1)]);
		}
		printf("%d\n",s);
	}
	return 0;
}
/*
6
5 6
6 1
6 2
2 3
2 4
3
2 5 2
1 4 1
1 6 3

*/
