#include<cstdio>
#include<iostream>
#define N 500005
using namespace std;
int f[N][21],h[N],dep[N],n,u,v,k,q,l,r,ans2,d[N<<2];
int ans[5005][5005];
struct bian{
	int e,n;
}a[1000005];
void add(int u,int v){
	a[++k].e=v,a[k].n=h[u],h[u]=k;
}
void dfs(int u,int fa){
	f[u][0]=fa;
	int v;
	for(int i=h[u];i;i=a[i].n){
		v=a[i].e;
		if(v != fa){
			dep[v]=dep[u]+1;
			dfs(v,u);
		}
	}
}
int lca(int u,int v){
	if(dep[u] > dep[v]) swap(u,v);
	for(int j=19;j>=0;j--){
		if(dep[v]-(1<<j) >= dep[u]) v=f[v][j];
	}
	if(u == v) return u;
	for(int j=19;j>=0;j--){
		if(f[u][j] != f[v][j]) u=f[u][j],v=f[v][j];
	}
	return f[u][0];
}
void build(int p,int l,int r){
	if(l == r){
		d[p]=l;
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	d[p]=lca(d[p<<1],d[p<<1|1]);
}
int fnd(int p,int l,int r,int x,int y){
	if(x <= l && r <= y) return d[p];
	int mid=l+r>>1;
	if(x <= mid && y > mid) return lca(fnd(p<<1,l,mid,x,y),fnd(p<<1|1,mid+1,r,x,y));
	else if(x <= mid) return fnd(p<<1,l,mid,x,y);
	else return fnd(p<<1|1,mid+1,r,x,y);
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	dep[1]=1;
	dfs(1,0);
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	scanf("%d",&q);
	if(n <= 5000 && q <= 5000){
		for(int i=1;i<=n;i++){
			ans[i][i]=i;
			for(int j=i+1;j<=n;j++){
				ans[i][j]=lca(ans[i][j-1],j);
//				printf("i=%d j=%d %d\n",i,j,ans[i][j]);
			}
		}
		while(q--){
			scanf("%d%d%d",&l,&r,&k);
			ans2=0;
			for(int i=l;i+k-1<=r;i++){
				ans2=max(ans2,dep[ans[i][i+k-1]]);
			}
			printf("%d\n",ans2);
		}		
	}
	else{
		build(1,1,n);
		while(q--){
			scanf("%d%d%*d",&l,&r);
			printf("%d\n",dep[fnd(1,1,n,l,r)]);
		}
	}
	return 0;
}
