#include<bits/stdc++.h>
using namespace std;
int n,q;
const int N=5e5+10;
int h[N<<1],to[N<<1],ne[N<<1],idx;
int t[N<<2];
int e[N<<2];
void add(int u,int v){
	to[++idx]=v;
	ne[idx]=h[u];
	h[u]=idx;
}
template <class T>
inline void read(T& x){
	x=0;
	T f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	x*=f;
}
int fa[N],son[N],sz[N],dep[N],top[N];
void dfs1(int u,int f){
	fa[u]=f;
	dep[u]=dep[f]+1;
	sz[u]=1;
	for(int i=h[u];i;i=ne[i]){
		int v=to[i];
		if(v==f){
			continue;
		}
		dfs1(v,u);
		sz[u]+=sz[v];
		if(sz[son[u]]<sz[v]){
			son[u]=v;
		}
	}
}
void dfs2(int u,int t){
	top[u]=t;
	if(son[u]){
		dfs2(son[u],t);
	}
	for(int i=h[u];i;i=ne[i]){
		int v=to[i];
		if(v==son[u]||v==fa[u]){
			continue;
		}
		dfs2(v,v);
	}
}
int lca(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]){
			swap(u,v);
		}
		u=fa[top[u]];
	}
	return dep[u]<dep[v]?u:v;
}
int ls(int p){
	return p<<1;
}
int rs(int p){
	return p<<1|1;
}
void push_up(int p){
	t[p]=max(t[rs(p)],t[ls(p)]);
}
void build(int p,int pl,int pr){
	if(pl==pr){
		t[p]=dep[pl];
		return ;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
int query(int p,int pl,int pr,int l,int r){
	if(l<=pl&&pr<=r){
		return t[p];
	}
	int ans=0;
	int mid=(pl+pr)>>1;
	if(l<=mid){
		ans=max(ans,query(ls(p),pl,mid,l,r));
	}
	if(r>mid){
		ans=max(ans,query(rs(p),mid+1,pr,l,r));
	}
	return ans;
}
void push_upp(int p){
	e[p]=lca(e[rs(p)],e[ls(p)]);
}
void build_p(int p,int pl,int pr){
	if(pl==pr){
		e[p]=pl;
		return;
	}
	int mid=(pl+pr)>>1;
	build_p(ls(p),pl,mid);
	build_p(rs(p),mid+1,pr);
	push_upp(p);
}
int query_p(int p,int pl,int pr,int l,int r){
	if(l<=pl&&pr<=r){
		return e[p];
	} 
	int ans=0;
	int mid=(pl+pr)>>1;
	if(l<=mid){
		ans=query_p(ls(p),pl,mid,l,r);
	}
	if(r>mid){
		if(ans==0){
			ans=query_p(rs(p),mid+1,pr,l,r);
		}else{
			ans=lca(ans,query_p(rs(p),mid+1,pr,l,r));
		}
	}
	return ans;
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	read(n);
	for(int i=1;i<n;i++){
		int u,v;
		read(u),read(v);
		add(u,v);
		add(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n); 
	build_p(1,1,n);
	read(q);
	while(q--){
		int l,r,k;
		read(l),read(r),read(k);
		if(k==1){
			printf("%d\n",query(1,1,n,l,r));
		}else{
			int ans=0;
			for(int i=l;i+k-1<=r;i++){
				int j=i+k-1;
				ans=max(ans,dep[query_p(1,1,n,i,j)]);
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}
/*
6
5 6
6 1
6 2
2 3
2 4
3
2 5 2
1 4 1
1 6 3
*/

