#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<string>
#include<bitset>
#include<cstring>
#include<cstdlib>
#include<numeric>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=5e5+10;
const int N=5e5;
const int INF=0x3f3f3f3f;
const long long LINF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
int n,m;
basic_string <int> tr[MAXN];
inline void add_edge(int x,int y){
	tr[x].push_back(y);
}
int dfc=0;
int dfn[MAXN],dad[MAXN],dep[MAXN];
void dfs(int x){
	dfc++;
	dfn[x]=dfc;
	dep[x]=dep[dad[x]]+1;
	for(int to:tr[x])
	{
		if(to^dad[x]){
			dad[to]=x;
			dfs(to);
		}
	}
}
int Log[MAXN];
inline void init(){
	for(int i=2;i<=n;i++)
	{
		Log[i]=Log[i>>1]+1;
	}
}
namespace LCA{
	int st[20][MAXN];
	inline int calc(int x,int y){
		return dfn[x]<dfn[y]?x:y;
	}
	inline void build(){
		for(int i=1;i<=n;i++)
		{
			st[0][dfn[i]]=dad[i];
		}
		for(int i=1;i<=Log[n];i++)
		{
			for(int j=1;j+(1<<i)-1<=n;j++)
			{
				st[i][j]=calc(st[i-1][j],st[i-1][j+(1<<(i-1))]);
			}
		}
	}
	inline int lca(int x,int y){
		if(x==y){
			return x;
		}
		x=dfn[x];
		y=dfn[y];
		if(x>y){
			swap(x,y);
		}
		x++;
		int lg=Log[y-x+1];
		return calc(st[lg][x],st[lg][y-(1<<lg)+1]);
	}
}
using LCA::lca;
namespace ST{
	int st[20][MAXN];
	inline void build(){
		for(int i=1;i<=n;i++)
		{
			st[0][i]=i;
		}
		for(int i=1;i<=Log[n];i++)
		{
			for(int j=1;j+(1<<i)-1<=n;j++)
			{
				st[i][j]=lca(st[i-1][j],st[i-1][j+(1<<(i-1))]);
			}
		}
	}
	inline int qry(int x,int y){
		int lg=Log[y-x+1];
		return lca(st[lg][x],st[lg][y-(1<<lg)+1]);
	}
}
namespace STC{
	int st[20][MAXN];
	inline void build(){
		for(int i=1;i<=n;i++)
		{
			st[0][i]=dep[i];
		}
		for(int i=1;i<=Log[n];i++)
		{
			for(int j=1;j+(1<<i)-1<=n;j++)
			{
				st[i][j]=max(st[i-1][j],st[i-1][j+(1<<(i-1))]);
			}
		}
	}
	inline int qry(int x,int y){
		int lg=Log[y-x+1];
		return max(st[lg][x],st[lg][y-(1<<lg)+1]);
	}
}
namespace super_solve{
	inline void solve(){
		STC::build();
		while(m--)
		{
			int l,r,k;
			scanf("%d%d%d",&l,&r,&k);
			if(k==1){
				printf("%d\n",STC::qry(l,r));
				continue;
			}
			int res=1;
			for(int i=l;i<=r-k+1;i++)
			{
				res=max(res,dep[ST::qry(i,i+k-1)]);
			}
			printf("%d\n",res);
		}
	}
}
namespace chain{
	namespace zkw{
		int M;
		int tr[MAXN<<2];
		inline void build(){
			M=1<<(__lg(n)+1);
			memset(tr,0xc0,sizeof(tr));
		}
	}
	inline bool check(){
		for(int i=2;i<=n;i++)
		{
			if(tr[i].size()>2){
				return false;
			}
		}
		return tr[1].size()==1;
	}
	// int L[MAXN],R[MAXN];
	// struct node{
	// 	int l,r,id;
	// };
	// basic_string <node> qry[MAXN];
	// basic_string <int> mdf[MAXN];
	// int ans[MAXN];
	inline void solve(){
		// for(int i=1;i<=n;i++)
		// {
		// 	int ql=1,qr=i,mid;
		// 	while(ql<qr)
		// 	{
		// 		mid=(ql+qr)>>1;
		// 		if(ST::qry(mid,i)==i){
		// 			qr=mid;
		// 		}
		// 		else{
		// 			ql=mid+1;
		// 		}
		// 	}
		// 	L[i]=ql;
		// }
		// for(int i=1;i<=n;i++)
		// {
		// 	int ql=i,qr=n,mid;
		// 	while(ql<qr)
		// 	{
		// 		mid=(ql+qr+1)>>1;
		// 		if(ST::qry(i,mid)==i){
		// 			ql=mid;
		// 		}
		// 		else{
		// 			qr=mid-1;
		// 		}
		// 	}
		// 	R[i]=ql;
		// }
		// for(int i=1;i<=n;i++)
		// {
		// 	mdf[R[i]-L[i]+1].push_back(i);
		// }
		STC::build();
		while(m--)
		{
			int l,r,k;
			scanf("%d%d%d",&l,&r,&k);
			if(k==1){
				printf("%d\n",STC::qry(l,r));
				continue;
			}
			int res=1;
			for(int i=l;i<=r-k+1;i++)
			{
				res=max(res,dep[ST::qry(i,i+k-1)]);
			}
			printf("%d\n",res);
		}
	}
}
inline void solve(){
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add_edge(x,y);
		add_edge(y,x);
	}
	dfs(1);
	init();
	LCA::build();
	ST::build();
	scanf("%d",&m);
	if(n<=5000&&m<=5000){
		super_solve::solve();
		return ;
	}
	if(chain::check()){
		chain::solve();
		return ;
	}
	super_solve::solve();
}
signed main(){
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	#ifdef LOCAL
	atexit([](){fprintf(stderr,"%.3lfs\n",(double)clock()/CLOCKS_PER_SEC);});
	#endif
	solve();
	return 0;
}
//为什么这么难啊？/kk