#include<bits/stdc++.h>
#define int long long
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int N=5201;
const int M=5e5+10;
int n,q,l,r,k;
struct Tree {
	int lc;
	int maxx;
} tree[M<<2];
struct Node {
	int to,nxt;
	Node() {
		to=nxt=0;
	}
	Node(int a,int b) {
		to=a,nxt=b;
	}
} adj[M<<1];
int head[M],idx;
int dep[M],f[M][22];
int res[N][N],cnt[N];
int wt[M];
inline void add(int x,int y) {
	adj[++idx]=Node(y,head[x]);
	head[x]=idx;
	return ;
}
inline void dfs(int u,int fa) {
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=1;i<=20;i++)
		f[u][i]=f[f[u][i-1]][i-1];
	for(int i=head[u];i;i=adj[i].nxt) {
		int v=adj[i].to;
		if(v==fa)
			continue;
		dfs(v,u);
	}
	return ;
}
inline int lca(int x,int y) {
	if(dep[x]<dep[y])	
		swap(x,y);
	for(int i=20;i>=0;i--) {
		if(dep[f[x][i]]>=dep[y])
			x=f[x][i]; 
	}
	if(x==y)
		return x;
	for(int i=20;i>=0;i--) {
		if(f[x][i]!=f[y][i]) {
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
inline void push_up(int rt,int l,int r) {
	tree[rt].lc=lca(tree[lson].lc,tree[rson].lc);
	if(r-l+1>=k)
		tree[rt].maxx=dep[tree[rt].lc];
	tree[rt].maxx=max(tree[lson].maxx,tree[rson].maxx);
	return ;
}
inline void build(int rt,int l,int r) {
	tree[rt].maxx=0;
	if(l==r) {
		tree[rt].lc=l;
		return ;
	}
	int mid=(l+r)>>1;
	build(lson,l,mid);
	build(rson,mid+1,r);
	push_up(rt,l,r);
	return ;
}
inline int query(int rt,int l,int r,int s,int t) {
	if(l>t||r<s)
		return -1;
	if(s<=l&&r<=t)
		return tree[rt].lc;
	int mid=(l+r)>>1;
	int L=query(lson,l,mid,s,t);
	int R=query(rson,mid+1,r,s,t);
	if(L==-1)
		return R;
	if(R==-1)
		return L;
	return lca(L,R);
}
signed main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<n;i++) {
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y),add(y,x);
	}
	dfs(1,0);
	if(n<=5e3) {
		for(int i=1;i<=n;i++) {
			int Max=1e18,p=i;
			for(int j=i;j<=n;j++) {
				p=lca(j,p);
				res[i][j]=dep[p];
			}
		}
		scanf("%lld",&q);
		while(q--) {
			scanf("%lld%lld%lld",&l,&r,&k);
			int ans=0;
			for(int i=l;i+k-1<=r;i++)
				ans=max(res[i][i+k-1],ans);
			printf("%lld\n",ans);
		}
	} else {
		build(1,1,n);
		scanf("%lld",&q);
		while(q--) {
			scanf("%lld%lld%lld",&l,&r,&k);
			printf("%lld\n",dep[query(1,1,n,l,r)]);
		}
	}
	return 0;
} 
/*
5
1 2
2 3
3 4
4 5
3
4 5 2
1 5 5
2 4 3
*/
