#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int baoli=1e5+10;

int n,q,num;
int lg[baoli],smn[baoli][23],smx[baoli][23];
int fa[maxn][23];
int dep[maxn],dfn[maxn],d[maxn];
int mx[maxn*4],se[maxn*4];
struct QUERY { int l,r,k; }Q[maxn];
vector<int>G[maxn];

#define lson (now<<1)
#define rson (now<<1|1)
#define mid ((l+r)>>1)
void pushup(int now) {
	mx[now]=max(mx[lson],mx[rson]);
	se[now]=max(max(se[lson],se[rson]),min(mx[lson],mx[rson]));
}
void build(int now,int l,int r) {
	if(l==r) { mx[now]=dep[l]; return; }
	build(lson,l,mid);
	build(rson,mid+1,r);
	pushup(now);
}
pair<int,int>qry(int now,int l,int r,int x,int y) {
	if(x<=l&&r<=y) return {mx[now],se[now]};
	pair<int,int>res,tmp;res={0,0};
	if(x<=mid) {
		tmp=qry(lson,l,mid,x,y);
		res={max(res.first,tmp.first),max(min(res.first,tmp.first),max(res.second,tmp.second))};
	}
	if(mid<y) {
		tmp=qry(rson,mid+1,r,x,y);
		res={max(res.first,tmp.first),max(min(res.first,tmp.first),max(res.second,tmp.second))};
	}
	return res;
}

void dfs(int u,int F) {
	dfn[u]=++num;dep[u]=dep[F]+1;fa[u][0]=F;
	for(int i=1;i<=20;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int v:G[u]) {
		if(v==F) continue;
		dfs(v,u);
	}
}
void st() {
	for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(int i=1;i<=n;i++)
		smn[i][0]=smx[i][0]=i;
	for(int j=1;j<=lg[n];j++) 
		for(int i=1;i+(1<<j)-1<=n;i++) {
			if(dfn[smn[i][j-1]]<dfn[smn[i+(1<<(j-1))][j-1]])
				smn[i][j]=smn[i][j-1];
			else smn[i][j]=smn[i+(1<<(j-1))][j-1];
			if(dfn[smx[i][j-1]]>dfn[smx[i+(1<<(j-1))][j-1]])
				smx[i][j]=smx[i][j-1];
			else smx[i][j]=smx[i+(1<<(j-1))][j-1];
		}
}
int query_max(int l,int r) {
	int len=lg[r-l+1];
	if(dfn[smx[l][len]]>dfn[smx[r-(1<<len)+1][len]]) return smx[l][len];
	else return smx[r-(1<<len)+1][len];
}
int query_min(int l,int r) {
	int len=lg[r-l+1];
	if(dfn[smn[l][len]]<dfn[smn[r-(1<<len)+1][len]]) return smn[l][len];
	else return smn[r-(1<<len)+1][len];
}
int LCA(int u,int v) {
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=20;i>=0;i--) 
		if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
	if(u==v) return u;
	for(int i=20;i>=0;i--) 
		if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
	return fa[u][0];
}
void subtask1() {
	dfs(1,0);
	st();
	for(int i=1;i<=q;i++) {
		int ans=0;
		for(int j=Q[i].l;j+Q[i].k-1<=Q[i].r;j++) {
			int p=j+Q[i].k-1;
			int L=query_min(j,p),R=query_max(j,p);
			ans=max(ans,dep[LCA(L,R)]);
		}
		printf("%d\n",ans);
	}
}
void subtask2() {
	int root=0;
	for(int i=n;i>=1;i--) if(d[i]==1) root=i;
	dfs(root,0);
	build(1,1,n);
	for(int i=1;i<=q;i++) {
		pair<int,int>tmp;
		tmp=qry(1,1,n,Q[i].l,Q[i].r);
		if(tmp.second!=0)printf("%d\n",tmp.second);
		else printf("%d\n",tmp.first);
	}
}
int main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i< n;i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
		d[u]++,d[v]++;
	}
	scanf("%d",&q);
	for(int i=1;i<=q;i++) 
		scanf("%d%d%d",&Q[i].l,&Q[i].r,&Q[i].k);
	if(n<=5000) subtask1();
	else subtask2();
	return 0;
}
