#include<bits/stdc++.h>
#define pb push_back
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
int n,q;
int head[500003],to[1000003],nt[1000003],tot=0;
void add(int x,int y){to[++tot]=y;nt[tot]=head[x];head[x]=tot;}
int dis[500003],siz[500003],hson[500003],fa[500003],top[500003];
vector<int>son[500003];
void dfs(int x,int h)
{
	dis[x]=h;siz[x]=1;
	for(int i=head[x];i;i=nt[i])
	{
		int y=to[i];
		if(fa[x]!=y)
		{
			fa[y]=x;son[x].pb(y);
			dfs(y,h+1);
			siz[x]+=siz[y];
			if(siz[y]>siz[hson[x]])hson[x]=y;
		}
	}
}
void pf(int x,int t)
{
	top[x]=t;
	if(hson[x])pf(hson[x],t);
	for(int y:son[x])
	{
		if(y!=hson[x])pf(y,y);
	}
}
int lca(int x,int y)
{
	if(!x||!y)return x|y;
	int fx=top[x],fy=top[y];
	while(fx!=fy)
	{
		if(dis[fx]<dis[fy])swap(fx,fy),swap(x,y);
		x=fa[fx],fx=top[x];
	}
	return dis[x]<dis[y]?x:y;
}
int xl[500003],xr[500003],xk[500003];
namespace sub1
{
	int a[5003][5003];
	void solve()
	{
		for(int i=1;i<=n;i++)
		{
			a[i][i]=i;
			for(int j=i+1;j<=n;j++)a[i][j]=lca(a[i][j-1],j);
		}
		for(int j=1;j<=q;j++)
		{
			int ans=0;
			for(int i=xl[j];i<=xr[j]-xk[j]+1;i++)ans=max(ans,dis[a[i][i+xk[j]-1]]);
			printf("%d\n",ans);
		}
	}
}
namespace B
{
	int a[2000003];
	void build(int x,int l,int r)
	{
		if(l==r){a[x]=l;return;}
		int mid=(l+r)>>1;
		build(ls,l,mid),build(rs,mid+1,r);
		a[x]=lca(a[ls],a[rs]);
	}
	int ans;
	void ask(int x,int l,int r,int p,int q)
	{
		if(l>q||r<p)return;
		if(p<=l&&r<=q){ans=lca(ans,a[x]);return;}
		int mid=(l+r)>>1;
		ask(ls,l,mid,p,q),ask(rs,mid+1,r,p,q);
	}
	void solve()
	{
		build(1,1,n);
		for(int i=1;i<=q;i++)
		{
			ans=0;ask(1,1,n,xl[i],xr[i]);
			printf("%d\n",dis[ans]);
		}
	}
}
namespace A
{
	struct node{
		int s,l,r,len;
	}a[2000003];
	struct as{
		int l,r,k,bh;
	}b[500003],f[500003],g[500003];
	node upd(node x,node y)
	{
		node t;t.s=max(max(x.s,y.s),x.r+y.l);
		t.len=x.len+y.len;
		t.l=x.l;t.r=y.r;
		if(x.l==x.len)t.l=x.l+y.l;
		if(y.r==y.len)t.r=y.r+x.r;
		return t;
	}
	void build(int x,int l,int r)
	{
		if(l==r){a[x].s=a[x].l=a[x].r=a[x].len=1;return;}
		int mid=(l+r)>>1;
		build(ls,l,mid),build(rs,mid+1,r);
		a[x]=upd(a[ls],a[rs]);
	}
	node ret;
	void ask(int x,int l,int r,int p,int q)
	{
		if(l>q||r<p)return;
		if(p<=l&&r<=q)
		{
			if(ret.len==-1)ret=a[x];
			else ret=upd(ret,a[x]);
			return;
		}
		int mid=(l+r)>>1;
		ask(ls,l,mid,p,q),ask(rs,mid+1,r,p,q);
	}
	void modif(int x,int l,int r,int p,int v)
	{
		if(l==r){a[x].l=a[x].r=a[x].s=v;return;}
		int mid=(l+r)>>1;
		if(p<=mid)modif(ls,l,mid,p,v);
		else modif(rs,mid+1,r,p,v);
		a[x]=upd(a[ls],a[rs]);
	}
	int ans[500003];
	int check(as x)
	{
		ret.len=-1;
		ask(1,1,n,x.l,x.r);
		return ret.s>=x.k;
	}
	int rk[500003];
	void sol(int l,int r,int L,int R)
	{
		if(l>r)return;
		if(L==R)
		{
			modif(1,1,n,rk[L],0);
			for(int i=l;i<=r;i++)ans[b[i].bh]=L;
			return;
		}
		int mid=(L+R)>>1;
		for(int i=L;i<=mid;i++)modif(1,1,n,rk[i],0);
		int cnt=0,ct=0;
		for(int i=l;i<=r;i++)
		{
			if(!check(b[i]))f[++cnt]=b[i];
			else g[++ct]=b[i];
		}
		for(int i=l;i<=l+cnt-1;i++)b[i]=f[i-l+1];
		for(int i=l+cnt;i<=r;i++)b[i]=g[i-l-cnt+1];
		sol(l+cnt,r,mid+1,R);
		for(int i=L;i<=R;i++)modif(1,1,n,rk[i],1);
		sol(l,l+cnt-1,L,mid);
		for(int i=mid+1;i<=R;i++)modif(1,1,n,rk[i],0);
	}
	void solve()
	{
		build(1,1,n);
		for(int i=1;i<=n;i++)rk[dis[i]]=i;
		for(int i=1;i<=q;i++)b[i].l=xl[i],b[i].r=xr[i],b[i].k=xk[i],b[i].bh=i;
		sol(1,q,1,n);
		for(int i=1;i<=q;i++)printf("%d\n",ans[i]);
	}
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int x,y;scanf("%d %d",&x,&y);
		add(x,y),add(y,x);
	}
	dfs(1,1);pf(1,1);
	scanf("%d",&q);
	int B=0;
	for(int i=1;i<=q;i++)
	{
		scanf("%d %d %d",&xl[i],&xr[i],&xk[i]);
		if(xk[i]!=xr[i]-xl[i]+1)B=1;
	}
	if(n<=5000&&q<=5000){sub1::solve();return 0;}
	if(!B){B::solve();return 0;}
	A::solve();
	return 0;
}
