#include<iostream>
#include<vector>
using namespace std;
struct daan{
	long long fa,top,dep,siz,son,bh,fbh;
}g[500001];
struct Seg{
	long long lb,ub,data;
};
long long a,b,d[5001][5001],bh;
vector<int>c[500001];
vector<Seg>tree[5001];
void dfs1(long long x,long long fa)
{
	g[x].fa=fa;
	g[x].dep=g[fa].dep+1;
	g[x].siz=1;
	long long mx=0;
	for(int z=0;z<c[x].size();z++)
	{
		if(c[x][z]==fa)
		  continue;
		dfs1(c[x][z],x);
		if(g[c[x][z]].siz>mx)
		{
			mx=g[c[x][z]].siz;
			g[x].son=c[x][z];
		}
		g[x].siz+=g[c[x][z]].siz;
	}
}
void dfs2(long long x,long long top)
{
	bh++;
	g[x].bh=bh;
	g[bh].fbh=x;
	g[x].top=top;
	if(g[x].son!=0)
	  dfs2(g[x].son,top);
	for(int z=0;z<c[x].size();z++)
	{
		if(c[x][z]==g[x].fa||c[x][z]==g[x].son)
		  continue;
		dfs2(c[x][z],c[x][z]);
	}
}
long long lca(long long x,long long y)
{
	while(g[x].top!=g[y].top)
	{
		if(g[g[x].top].dep<g[g[y].top].dep)
		  swap(x,y);
		x=g[g[x].top].fa;
	}
	if(g[x].dep>g[y].dep)
	  swap(x,y); 
	return x;
}
void build(long long pos,long long p,long long l,long long r)
{
	if(l==r)
	{
		tree[pos][p].data=g[d[pos][l]].dep;
		return;
	}
	long long mid=(l+r)>>1;
	tree[pos][p].lb=tree[pos].size();
	tree[pos].push_back((Seg){0,0,0});
	build(pos,tree[pos][p].lb,l,mid);
	tree[pos][p].ub=tree[pos].size();
	tree[pos].push_back((Seg){0,0,0});
	build(pos,tree[pos][p].ub,mid+1,r);
	tree[pos][p].data=max(tree[pos][tree[pos][p].lb].data,tree[pos][tree[pos][p].ub].data);
}
long long query(long long pos,long long p,long long l,long long r,long long lb,long long ub)
{
	if(lb<=l&&r<=ub)
	  return tree[pos][p].data;
	long long mid=(l+r)>>1,jkl=0;
	if(lb<=mid)
	  jkl=max(jkl,query(pos,tree[pos][p].lb,l,mid,lb,ub));
	if(ub>mid)
	  jkl=max(jkl,query(pos,tree[pos][p].ub,mid+1,r,lb,ub));
	return jkl;
}
int main()
{
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	cin>>a;
	for(int z=1;z<a;z++)
	{
		long long j,k;
		cin>>j>>k;
		c[j].push_back(k);
		c[k].push_back(j);
	}
	dfs1(1,0);
	dfs2(1,1);
	if(a<5001)
	{
		for(int z=1;z<=a;z++)
		  d[1][z]=z;
		for(int z=2;z<=a;z++)
		  for(int y=1;y+z-1<=a;y++)
			d[z][y]=lca(d[z-1][y],y+z-1);
		for(int z=1;z<=a;z++)
		{
			tree[z].push_back((Seg){0,0,0});
			tree[z].push_back((Seg){0,0,0});
			build(z,1,1,a-z+1);
		}
		cin>>b;
		for(int z=1;z<=b;z++)
		{
			long long j,k,l,ans=0;
			cin>>j>>k>>l;
			for(int y=l;y+j-1<=k;y++)
			  ans=max(ans,query(y,1,1,a-y+1,j,k-y+1));
			cout<<ans<<endl;
		}
	}
	return 0;
}
