#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int M=21;
int n,q,dep[N],siz[N],fa[N],son[N],top[N],LCA[N],DEP[N];
int du[N],lg[N],t[N][M],s[N],cnt1=0,cnt2=0,totcnt=0;
int head[N<<1],nxt[N<<1],to[N<<1],tot=0;
void add(int u,int v)
{
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
		s=s*10+(ch-'0'),ch=getchar();
	return s*w; 
}
void dfs1(int u,int f)
{
	fa[u]=f;
	dep[u]=dep[f]+1;
	siz[u]=1;
	for(int i=head[u];i;i=nxt[i])
	{
		int v=to[i];
		if(v==f)
			continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[son[u]]<siz[v])
			son[u]=v;
	}
}
void dfs2(int u,int f)
{
	top[u]=f;
	if(son[u])
		dfs2(son[u],f);
	for(int i=head[u];i;i=nxt[i])
		if(to[i]!=fa[u]&&to[i]!=son[u])
			dfs2(to[i],to[i]);
}
int lca(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])
		return x;
	else
		return y;
}
void work()
{
	for(int i=2;i<=N-10;i<<=1)
		lg[i]=1;
	for(int i=2;i<=N-10;++i)
		lg[i]+=lg[i-1];
	for(int j=1;j<=lg[n];++j)
		for(int i=1;i+(1<<j)-1<=n;++i)
			t[i][j]=min(t[i][j-1],t[i+(1<<(j-1))][j-1]);
}
int ask(int l,int r)
{
	if(r<l)
		return dep[l];
	int k=lg[r-l+1];
	return min(t[l][k],t[r-(1<<k)+1][k]); 
}
struct tree2
{
	int l,r,v;
}t2[N*M];
void update(int root)
{
	t2[root].v=t2[t2[root].l].v+t2[t2[root].r].v;
}
void insert(int last,int &root,int l,int r,int pos)
{
	if(!root)
		root=++totcnt;
	t2[root]=t2[last];
	if(l==r)
		t2[root].v++;
	else
	{
		int mid=(l+r)>>1;
		if(pos<=mid)	
			insert(t2[last].l,t2[root].l=0,l,mid,pos);
		else
			insert(t2[last].r,t2[root].r=0,mid+1,r,pos);
		update(root);
	}
}
int ask2(int last,int root,int l,int r,int k)
{
	if(l==r)
		return l;
	int mid=(l+r)>>1;
	if(t2[t2[root].l].v-t2[t2[last].l].v>=k)
		return ask2(t2[last].l,t2[root].l,l,mid,k);
	else	
		return ask2(t2[last].r,t2[root].r,mid+1,r,k-(t2[t2[root].l].v-t2[t2[last].l].v));
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout); 
	n=read();
	for(int i=1;i<=n-1;++i)
	{
		int u=read(),v=read();
		add(u,v);
		add(v,u);
		du[u]++,du[v]++;
	}
	dfs1(1,0);
	dfs2(1,1);
	for(int i=1;i<=n-1;++i)
		t[i][0]=dep[lca(i,i+1)];
	work(); 
	for(int i=1;i<=n;++i)	
		cnt1+=(du[i]==1),cnt2+=(du[i]==2);
	if(cnt1==2&&cnt2==n-2)
	{
		for(int i=1;i<=n;++i)	
			insert(s[i-1],s[i],1,n,dep[i]);
		q=read();
		while(q--)
		{
			int l=read(),r=read(),k=read();
			printf("%d\n",ask2(s[l-1],s[r],1,n,r-l+1-k+1));
		}
	}
//	else if(n<=5000)
//	{
//		;
//	}
	else
	{
		q=read();
		while(q--)
		{
			int l=read(),r=read(),k=read(),ans=0;	
			for(int L=l;L<=r;++L)
				for(int R=L+k-1;R<=r;++R)
					ans=max(ans,ask(L,R-1));
			printf("%d\n",ans);
		}
	}
	return 0;
}
