#include<bits/stdc++.h>
using namespace std;
int n,q,l,r,k,cnt,head[500005],d[500005],fa[500005][20];
struct node {
	int v,las;
}edge[1000005];
int input() {
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9') {
		c=getchar();
	}
	while('0'<=c&&c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
void add(int u,int v) {
	cnt++;
	edge[cnt].v=v;
	edge[cnt].las=head[u];
	head[u]=cnt;
	return;
}
bool cmp(int a,int b) {
	return a>b;
}
void dfs(int u,int dep) {
	d[u]=dep;
	for(int i=head[u]; i; i=edge[i].las) {
		int v=edge[i].v;
		if(!d[v]&&v!=fa[u][0]) {
			fa[v][0]=u;
			dfs(v,dep+1);
		}
	}
	return;
}
int lca(int u,int v) {
	if(d[u]>d[v]) {
		swap(u,v);
	}
	int len=log2(d[v]-d[u]);
	for(int i=len; i>=0; i--) {
		if(d[v]-(1<<i)>=d[u]) {
			v=fa[v][i];
		}
	}
	if(u==v) {
		return u;
	}
	len=log2(d[u]);
	for(int i=len; i>=0; i--) {
		if(fa[u][i]!=fa[v][i]) {
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}
int main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	int u,v;
	n=input();
	for(int i=1; i<n; i++) {
		u=input();
		v=input();
		add(u,v);
		add(v,u);
	}
	dfs(1,1);
	int lgn=log2(n);
	for(int j=1; j<=lgn; j++) {
		for(int i=1; i<=n; i++) {
			if(d[i]-(1<<j)>=1) {
				fa[i][j]=fa[fa[i][j-1]][j-1];
			}
		}
	}
	q=input();
	while(q--) {
		int LCA=0,ans=0;
		l=input();
		r=input();
		k=input();
		for(int i=l; i+k-1<=r; i++) {
			LCA=i;
			for(int j=i+1; j<=i+k-1; j++) {
				LCA=lca(LCA,j);
			}
			ans=max(ans,d[LCA]);
		}
		printf("%d\n",ans);
	}
	return 0;
}
