#include<cstdio>
const int N(5e5+5);
int MAX(int a,int b){return a>b?a:b;}
int MIN(int a,int b){return a<b?a:b;}
struct Segment_Tree
{
	int mn[N<<2];
	#define ls (k<<1)
	#define rs (k<<1|1)
	void build_tree(int k,int l,int r,int*a)
	{
		if(l==r)return mn[k]=a[l],void();
		int mid(l+r>>1);
		build_tree(ls,l,mid,a),build_tree(rs,mid+1,r,a);
		mn[k]=MIN(mn[ls],mn[rs]);
	}
	int query(int k,int l,int r,int x,int y)
	{
		if(l>=x&&r<=y)return mn[k];
		int mid(l+r>>1),ans(1e9);
		if(x<=mid)ans=MIN(query(ls,l,mid,x,y),ans);
		if(y>mid)ans=MIN(query(rs,mid+1,r,x,y),ans);
		return ans;
	}
	#undef ls
	#undef rs
}tr;
struct edge{int to,nxt;}e[N<<1];
int tot,head[N],dep[N];
void add(int u,int v)
{e[++tot]=(edge){v,head[u]},head[u]=tot;}
void dfs(int u,int fa)
{
	int to,i;
	for(i=head[u];i;i=e[i].nxt)
	  if((to=e[i].to)!=fa)
		dep[to]=dep[u]+1,dfs(to,u);
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	int n,q,u,v,l,r,ans,k,i;
	scanf("%d",&n);
	for(i=1;i<n;i++)
	  scanf("%d %d",&u,&v),
	  add(u,v),add(v,u);
	dep[1]=1,dfs(1,0);
	tr.build_tree(1,1,n,dep);
	for(scanf("%d",&q);q--;)
	{
		scanf("%d %d %d",&l,&r,&k);
		ans=-1;
		for(i=l+k-1;i<=r;i++)
		  ans=MAX(tr.query(1,1,n,i-k+1,i),ans);
		printf("%d\n",ans);
	}
	return ~~(0-0);
}
