#include<bits/stdc++.h>
#define ll long long
#define db double
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
bool mem1;
namespace MATT{
const int maxn=5e5+10;
int n,q;
namespace Graph{
	const int maxm=maxn<<1;
	int cnt,head[maxn];
	struct edge{int nxt,to;}e[maxm];
	inline void add(int u,int v){e[++cnt]={head[u],v};head[u]=cnt;}
	inline void adde(int u,int v){add(u,v);add(v,u);}
}
using namespace Graph;
int tot;
int dep[maxn],dfsn[maxn];
namespace ST{
	int st[21][maxn],Log[maxn];
	inline int mindfn(int x,int y){return dfsn[x]<dfsn[y]?x:y;}
	void build(){
		for(int i=2;i<=n;i++)	Log[i]=Log[i/2]+1;
		for(int i=1;i<21;i++)
			for(int j=1;j+(1<<i)-1<=n;j++)	st[i][j]=mindfn(st[i-1][j],st[i-1][j+(1<<i>>1)]);
	}
	inline int LCA(int x,int y){if(x==y)return x;if((x=dfsn[x])>(y=dfsn[y]))swap(x,y);int k=Log[y-x++];return mindfn(st[k][x],st[k][y-(1<<k)+1]);}
}using ST::LCA;
int nex[21][maxn];
void dfs(int u,int fa){
	dfsn[u]=++tot;ST::st[0][dfsn[u]]=fa;
	dep[u]=dep[fa]+1;
	for(int i=head[u];i;i=e[i].nxt){
		int t=e[i].to;
		if(t==fa)	continue;
		dfs(t,u);
	}
}
void matt(){
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++){
		scanf("%d%d",&u,&v);
		adde(u,v);
	}
	dfs(1,0);
	ST::build();
	for(int i=1;i<n;i++)	nex[0][i]=LCA(i,i+1);
	for(int i=1;i<21;i++)
		for(int j=1;j+(1<<i)-1<=n;j++)	nex[i][j]=LCA(nex[i-1][j],nex[i-1][j+(1<<i>>1)]);
	scanf("%d",&q);
	while(q--){
		int l,r,k,ans=0;
		scanf("%d%d%d",&l,&r,&k);
		if(k==1){
			for(int i=l;i<=r;i++)
				ans=max(ans,dep[i]);
			printf("%d\n",ans);
			continue;
		}
		for(int i=l;i+k-1<=r;i++){
			int j=i+k-1,p=i,res=0;
			for(int o=20;~o;o--)
				if(p+(1<<o)<=j){
					if(!res)	res=nex[o][p];
					else	res=LCA(res,nex[o][p]);
					p+=(1<<o);
				}
			ans=max(ans,dep[res]);
		}
		printf("%d\n",ans);
	}
}
}
bool mem2;
int main(){
	freopen("query.in","r",stdin);freopen("query.out","w",stdout);
	int T=1;while(T--) MATT::matt();
}
