#include<iostream>

using namespace std;

const int maxn=5e5+10;
int n,head[maxn],son[maxn],top[maxn],T,fa[maxn],dep[maxn],cnt,sz[maxn],lcx[maxn],st[maxn][30],lg[maxn];
struct edge
{
	int to,nxt;
}g[maxn];

void add(int u,int v)
{
	g[++cnt].to=v;
	g[cnt].nxt=head[u];
	head[u]=cnt;
}

void dfs(int u,int p)
{
	dep[u]=dep[p]+1;
	fa[u]=p;
	sz[u]=1;
	for(int i=head[u];i;i=g[i].nxt)
	{
		int v=g[i].to;
		if(v==p) continue;
		dfs(v,u);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]]) son[u]=v;
	}
}

void build(int u,int t)
{
	top[u]=t;
	if(son[u]) build(son[u],t);
	for(int i=head[u];i;i=g[i].nxt)
	{
		int v=g[i].to;
		if(v==fa[u]||v==son[u]) continue;
		build(v,v);
	}
}

int lca(int u,int v)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		u=fa[top[u]];
	}
	return (dep[u]<dep[v]?u:v);
}

int query(int l,int r)
{
	if(l>r) return dep[l];
	int s=lg[r-l+1];
	return min(st[l][s],st[r-(1<<s)+1][s]);
}

void stb()
{
	for(int i=1;i<=n;i++) st[i][0]=lcx[i];
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
		}
	}
}

int check(int l,int r,int k,int x)
{
	for(int i=l;i+k-1<=r;i++)
	{
		if(query(i,i+k-1)>=x) return 1;
	}
	return 0;
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	dep[0]=0;
	lg[1]=0;
	for(int i=2;i<maxn;i++) lg[i]=lg[i/2]+1;
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	build(1,1);
	for(int i=1;i<n;i++) lcx[i]=dep[lca(i,i+1)];
	stb();
	cin>>T;
	while(T--)
	{
		int l,r,k;
		cin>>l>>r>>k;
		int lx=1,rx=n,mid,ans;
		while(lx<=rx)
		{
			mid=(lx+rx)>>1;
			if(check(l,r-1,k-1,mid)) ans=mid,lx=mid+1;
			else rx=mid-1;
		}
		cout<<ans<<"\n";
	}
}



















