#include<bits/stdc++.h>
#define fo(i,l,r) for(int i=(l);i<=(r);++i)
#define fd(i,l,r) for(int i=(l);i>=(r);--i)
#define fu(i,l,r) for(int i=(l);i<(r);++i)
#define ll long long
using namespace std;
int read(){int s=0;char c=getchar();while(c<48||c>57)c=getchar();while(c>=48&&c<=57)s=(s<<3)+(s<<1)+(c^48),c=getchar();return s;}
void out(int x){if(x>9)out(x/10);putchar(x%10+48);}
const int N=500007,L=19;
int n,dfn[N],f[N],cnt,dep[N],top,t[N<<2],ans[N],q;
struct node{
	int x,y;
}st[N];
struct opr{
	int x,y;
};
struct Qry{
	int l,r,bh;
};
vector<opr>b[N];
vector<Qry>Q[N];
int tot,to[N<<1],head[N],nx[N<<1];
void add(int x,int y){to[++tot]=y;nx[tot]=head[x];head[x]=tot;}
int g[N][L+1],h[N][L+1];
int Min(int x,int y){return dep[x]<dep[y]?x:y;}
void dfs(int x,int y)
{
	dfn[x]=++cnt;g[cnt][0]=x;
	for(int i=head[x],j;i;i=nx[i])
	{
		j=to[i];if(j==y) continue;
		dep[j]=dep[x]+1;f[j]=x;dfs(j,x);
	}
}
void init()
{
	fo(j,1,L) fo(i,1,n-(1<<j)+1) g[i][j]=Min(g[i][j-1],g[i+(1<<j-1)][j-1]);
}
int LCA(int x,int y)
{
	if(x==y) return x;
	x=dfn[x];y=dfn[y];
	if(x>y) swap(x,y);
	int l=31-__builtin_clz(y-x);
	return f[Min(g[x+1][l],g[y-(1<<l)+1][l])];
}
void ins(int l,int r,int c)
{
	b[r-l+1].push_back((opr){l,c});
}
int query(int l,int r)
{
	int o=31-__builtin_clz(r-l+1);
	return LCA(h[l][o],h[r-(1<<o)+1][o]);
}
void upd(int l,int r,int o,int x,int y)
{
	if(l==r){t[o]=max(t[o],y);return;}
	int mid=l+r>>1;
	if(x<=mid) upd(l,mid,o+o,x,y);
	else upd(mid+1,r,o+o+1,x,y);
	t[o]=max(t[o+o],t[o+o+1]);
}
int qry(int l,int r,int o,int x,int y)
{
	if(x<=l&&r<=y) return t[o];
	int mid=l+r>>1;
	if(y<=mid) return qry(l,mid,o+o,x,y);
	if(x>mid) return qry(mid+1,r,o+o+1,x,y);
	return max(qry(l,mid,o+o,x,y),qry(mid+1,r,o+o+1,x,y));
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for(int i=1,u,v;i<n;++i) u=read(),v=read(),add(u,v),add(v,u);
	dep[1]=1;dfs(1,0);
	init();
	fd(i,n,1)
	{
		int l=i,o=i;
		while(top&&(o==st[top].x||LCA(i,st[top].x)!=st[top].x))
		{
			ins(i+1,st[top].y,dep[st[top].x]);
			o=LCA(i,st[top].x);l=st[top].y;top--;
		}
		st[++top]=(node){o,l};
		if(i!=o) st[++top]=(node){i,i};
	}
	fo(i,1,n) h[i][0]=i;
	fo(j,1,L) fo(i,1,n-(1<<j)+1) h[i][j]=LCA(h[i][j-1],h[i+(1<<j-1)][j-1]);
	q=read();
	fo(i,1,q)
	{
		int l,r,k;l=read();r=read();k=read();
		ans[i]=dep[query(l,l+k-1)];
		Q[k].push_back((Qry){l,r-k+1,i});
	}
	fd(i,n,1)
	{
		for(opr w:b[i]) upd(1,n,1,w.x,w.y);
		for(Qry w:Q[i]) ans[w.bh]=max(ans[w.bh],qry(1,n,1,w.l,w.r));
	}
	fo(i,1,q) out(ans[i]),putchar('\n');
}
