#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int n;
int read(){
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x;
}
void write(int x){
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
struct edge{
	int to,next;
}e[maxn<<1];
int head[maxn],cnt;
void add(int u,int v){
	e[++cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
}
int fa[maxn],top[maxn],sz[maxn],son[maxn],dep[maxn];
int num;
void dfs1(int u,int f){
	fa[u]=f;sz[u]++;dep[u]=dep[f]+1;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		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;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(v==son[u]) dfs2(v,t);
		if(v==fa[u]) continue;
		if(v!=son[u]){num++;dfs2(v,v);}
	}
}
int LCA(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=fa[top[x]];
		if(top[x]==top[y]) break;
	}
	if(dep[x]<dep[y]) return x;
	return y;
}
int pos[maxn],st[maxn],ed[maxn],plca[maxn];
int Query(int L,int R){
	int p=pos[L],q=pos[R];
	int ans=0;
	if(p==q||p+1==q){
		ans=L;
		for(int i=L+1;i<=R;i++) ans=LCA(ans,i);
	}else{
		ans=plca[p+1];
		for(int i=p+2;i<=q-1;i++) ans=LCA(ans,plca[i]);
		for(int i=L;i<=ed[p];i++) ans=LCA(ans,i);
		for(int i=st[q];i<=R;i++) ans=LCA(ans,i);
	}
	return ans;
}
int main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for(int i=1;i<n;i++){
		int u,v;u=read();v=read();
		add(u,v);add(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
	int block=sqrt(n);
	int t=n/block;
	if(n%block) t++;
	for(int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
	for(int i=1;i<=t;i++){
		st[i]=(i-1)*block+1;
		ed[i]=i*block;
	}
	ed[t]=n;
	for(int i=1;i<=t;i++){
		int res=st[i];
		for(int j=st[i]+1;j<=ed[i];j++) res=LCA(res,j);
		plca[i]=res;
	}
	int q;q=read();
	while(q--){
		int l,r,k,ans=0;l=read();r=read();k=read();
		if(k==1){
			for(int i=l;i<=r;i++) ans=max(ans,dep[i]);
			write(ans);putchar('\n');
		}
		else if(k==r-l+1){
			int ans=Query(l,r);
			write(dep[ans]);putchar('\n');
		}
		else{
			for(int i=l;i+k-1<=r;i++){
				int res=Query(i,i+k-1);
				ans=max(ans,dep[res]);
			}
			write(ans);putchar('\n');
		}
	}
	return 0;
}
/*
6
5 6
6 1
6 2
2 3
2 4
3
2 5 2
1 4 1
1 6 3
*/
