#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define gc getchar
#define pb push_back
#define abs_(x) max(x,-(x))
#define all(x) x.begin(),x.end()
#define y1 __
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define dFor(i,a,b) for(int i=(a);i>=(b);i--)
#define tomin(x,y) x=min(x,y)
#define tomax(x,y) x=max(x,y)
const int N=5e5+5,M=N*2; 
int read()
{
	int x=0; int y=1; char c=gc();
	for(;!isdigit(c);c=gc()) if(c=='-') y=0;
	for(;isdigit(c);c=gc()) x=(x<<3)+(x<<1)+(c^48);
	return y?x:-x; 
}
int n,Q;
int ev[M],enx[M],ep[N],ect;
void add_v(int u,int v)
{
	ev[++ect]=v;
	enx[ect]=ep[u];
	ep[u]=ect;
}
int fa[N],d[N],sz[N],son[N];
int dfn[N],bz[20][N],lg[N],idfn[N],dct;
int bz2[20][N];
struct _Q
{
	int l,r,k,id;
}q[N];
bool cmp11(_Q x,_Q y) { return x.k>y.k; }
bool cmp22(_Q x,_Q y) { return x.l<y.l; }
bool cmp33(_Q x,_Q y) { return x.r<y.r; }

struct _N
{
	int l,r,s;
	int len() { return r-l+1; }
}h[M];
bool cmp1(_N x,_N y) { return x.len()>y.len(); }
bool cmp2(_N x,_N y) { return x.l<y.l; }
bool cmp3(_N x,_N y) { return x.r<y.r; }

int ct;
bool vs[N];
int fal[N],far[N];
int findl(int x) { return !vs[x-1]?x:fal[x]=findl(min(fal[x],x-1)); }
int findr(int x) { return !vs[x+1]?x:far[x]=findr(max(far[x],x+1)); }
void add(int l,int r,int s)
{
	For(i,l,r) vs[i]=1;
	if(!vs[l-1]&&!vs[r+1]) return;
	int tl=findl(l),tr=findr(r);
	h[++ct]=(_N){tl,tr,s};
}
void dfs3(int u)
{
	fal[u]=far[u]=u; vs[u]=0;
	for(int i=ep[u];i;i=enx[i]) if(ev[i]^fa[u]) dfs3(ev[i]);
}
void dfs0(int u)
{
	dfn[u]=++dct;
	idfn[dfn[u]]=u;
	bz[0][dfn[u]]=dfn[fa[u]];
	d[u]=d[fa[u]]+1;
	sz[u]=1;
	for(int i=ep[u];i;i=enx[i])
	{
		int v=ev[i];
		if(v==fa[u]) continue;
		fa[v]=u;
		dfs0(v);
		sz[u]+=sz[v];
		if(sz[v]>sz[son[u]]) son[u]=v;
	}
}
int get_mn(int l,int r)
{
	int t=lg[r-l+1];
	return min(bz[t][l],bz[t][r-(1<<t)+1]);
}
int lca(int u,int v)
{
	if(u==v) return u;
	u=dfn[u],v=dfn[v]; if(u>v) swap(u,v);
	return idfn[get_mn(u+1,v)];
}
int get_lca(int l,int r)
{
	int t=lg[r-l+1];
	return lca(bz2[t][l],bz2[t][r-(1<<t)+1]);
}
int h2[N],ct2; 
void dfs2(int u)
{
	h2[++ct2]=u;
	for(int i=ep[u];i;i=enx[i]) if(ev[i]^fa[u]) dfs2(ev[i]);
}
void dfs1(int u,bool cs)
{
//	cout<<u<<endl;
	for(int i=ep[u];i;i=enx[i])
	{
		int v=ev[i];
		if(v==fa[u]||v==son[u]) continue;
		dfs1(v,1);
	}
	if(son[u])
	{
		dfs1(son[u],0);
	}
	h[++ct]=(_N){u,u,d[u]};
	add(u,u,d[u]);
	for(int i=ep[u];i;i=enx[i])
	{
		int v=ev[i];
		if(v==fa[u]||v==son[u]) continue;
		ct2=0;
		dfs2(v);
		stable_sort(h2+1,h2+ct2+1);
		int las=0;
		For(i,1,ct2) if(i==ct2||h2[i]!=h2[i+1])
		{
			int l=h2[las+1];
			add(l,h2[i],d[u]);
			las=i;
		}
	}
	if(cs)
	{
		dfs3(u);
	}
}
struct _T
{
	int l,r,mx;
}tr[N*4];
#define ls (o<<1)
#define rs (o<<1|1) 
void up_(int o)
{
	tr[o].mx=max(tr[ls].mx,tr[rs].mx);
}
void build(int o,int l,int r)
{
	tr[o]=(_T){l,r,0};
	if(l==r) return;
	build(ls,l,(l+r>>1));
	build(rs,(l+r>>1)+1,r);
	up_(o);
}
void change(int o,int x,int y)
{
	if(tr[o].l==tr[o].r) { tomax(tr[o].mx,y); return; }
	if(tr[ls].r>=x) change(ls,x,y);
	else change(rs,x,y);
	up_(o);
}
int query(int o,int l,int r)
{
	if(tr[o].l>=l&&tr[o].r<=r) return tr[o].mx;
	if(tr[ls].r>=r) return query(ls,l,r);
	if(tr[rs].l<=l) return query(rs,l,r);
	return max(query(ls,l,r),query(rs,l,r));
}
int ans[N];
void solve1()
{
	sort(q+1,q+Q+1,cmp11);
	sort(h+1,h+ct+1,cmp1);
	build(1,1,n);
	int j=1;
	For(i,1,Q)
	{
		while(j<=ct&&h[j].len()>=q[i].k)
		{
			change(1,h[j].l,h[j].s);
			j++;
		}
		tomax(ans[q[i].id],query(1,q[i].l,q[i].r-q[i].k+1));
	}
	build(1,1,n);
	j=1;
	For(i,1,Q)
	{
		while(j<=ct&&h[j].len()>=q[i].k)
		{
			change(1,h[j].r,h[j].s);
			j++;
		}
		tomax(ans[q[i].id],query(1,q[i].l+q[i].k-1,q[i].r));
	}
}
void out(int x)
{
	if(x>9) out(x/10);
	putchar(x%10+'0');
}
void work()
{
	n=read();
	For(i,1,n-1)
	{
		int u=read(),v=read();
		add_v(u,v);
		add_v(v,u);
	}
//	puts("FLY");
	dfs0(1); 
	For(i,1,lg[n])
	{
		For(j,1,n-(1<<i)+1) bz[i][j]=min(bz[i-1][j],bz[i-1][j+(1<<i-1)]);
	}
	For(i,1,n) bz2[0][i]=i;
	For(i,1,lg[n])
	{
		For(j,1,n-(1<<i)+1) bz2[i][j]=lca(bz2[i-1][j],bz2[i-1][j+(1<<i-1)]);
	}
	Q=read();
	For(i,1,Q)
	{
//		cout<<i<<" "<<Q<<endl;
		q[i]=(_Q){read(),read(),read(),i};
//		cout<<get_lca(q[i].l,q[i].r)<<endl;
		tomax(ans[i],d[get_lca(q[i].l,q[i].r)]);
	}
//	For(u,1,n)
//	{
//		For(v,1,n) cout<<lca(u,v)<<" ";
//		puts("");
//	}
	For(u,1,n) fal[u]=far[u]=u;
	dfs1(1,0);
	solve1();
	
	
	For(i,1,Q) out(ans[i]),putchar('\n');
//	For(i,1,ct)
//	{
//		cout<<h[i].l<<" "<<h[i].r<<" "<<h[i].s<<endl;
//	}
}
int main()
{
//	freopen("query1.in","r",stdin);
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	For(i,2,N-2) lg[i]=lg[i>>1]+1;
	work(); 
	return 0;
}


/*




估计要离线 
估计要转换，lca(l,r)= min dfn 相邻 

按 K 分块？不知道 

1-5 just do

B 直接查？倍增即可 
A：这不是？？
	区间最小值的最大值
	有一个根号log 
	
	
盲猜支配 
	任意一个子区间的 lca 都
	
按 k 扫描线 

min-max 熔池？


直接大分块

	要用到树的性质
	
直接启发式合并处理出区间然后直接做 


11:13：可能回了
应该是但log的 


12:14写完了，大洋里2.3，先跑路 
*/


