#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
	int x=0,t=0;
	char c=getchar();
	while(c<'0'||c>'9') t|=c=='-',c=getchar();
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return t?-x:x;
}
inline void putc(char c){
	putchar(c);
}
inline void write(int x){
	if(x<0) putc('-'),x=-x;
	if(x>9) write(x/10);
	putc('0'+x%10);
}
inline char getc(){
	char c=getchar();
	while(c<'0'||c>'1') c=getchar();
	return c;
}
#define pii pair<int,int>
#define mpr make_pair
#define fir first
#define sec second
const int N=5e5+10,M=(1<<20)+10,V=1e7+10;
int n,q,L[N],R[N],K[N],ans[N],dep[N],head[N],cnt,p[N];
struct Edge{
	int to,nxt;
}a[N<<1];
inline void add(int u,int v){
	a[++cnt]={v,head[u]},head[u]=cnt;
}
struct Rng{
	int l,r,d,len;
}nd[V];
int c;
set<pii>s[N];
inline void merge(int x,int t,int d){
	if(s[x].size()<s[t].size()) swap(s[x],s[t]);
	for(auto tp:s[t]){
		auto itr=s[x].lower_bound(tp),itl=itr;
		int L=tp.fir,R=tp.sec,tl=0,tr=0;
		if(itr!=s[x].end()&&itr->fir==R+1) R=itr->sec,tr=1;
		if(itl!=s[x].begin()&&(--itl)->sec==L-1) L=itl->fir,tl=1;
		if(tl) s[x].erase(itl);
		if(tr) s[x].erase(itr);
		s[x].insert(mpr(L,R));
		if(tl||tr) nd[++c]={L,R,d,R-L+1};
	}
	s[t].clear();
}
inline void dfs(int x,int fa){
	dep[x]=dep[fa]+1,s[x].insert(mpr(x,x));
	nd[++c]={x,x,dep[x],1};
	for(int i=head[x];i;i=a[i].nxt){
		int t=a[i].to;
		if(t==fa) continue;
		dfs(t,x);
		merge(x,t,dep[x]);
	}
}
struct ST_Table{
	int st[19][N],lc[19][N],dfn[N],tim;
	inline void dfs(int x,int fa){
		st[0][dfn[x]=++tim]=fa;
		for(int i=head[x];i;i=a[i].nxt){
			int t=a[i].to;
			if(t==fa) continue;
			dfs(t,x);
		}
	}
	inline int cmp(int x,int y){
		return dep[x]<dep[y]?x:y;
	}
	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 t=__lg(y-x+1);
		return cmp(st[t][x],st[t][y-(1<<t)+1]);
	}
	inline int LCAT(int l,int r){
		if(l==r) return l;
		r--;
		int t=__lg(r-l+1);
		return LCA(lc[t][l],lc[t][r-(1<<t)+1]);
	}
	inline void init(){
		dfs(1,1);
		for(int i=1;(1<<i)<=n;i++)
			for(int j=1;j+(1<<i)-1<=n;j++)
				st[i][j]=cmp(st[i-1][j],st[i-1][j+(1<<i-1)]);
		for(int i=1;i<n;i++)
			lc[0][i]=LCA(i,i+1);
		for(int i=1;(1<<i)<n;i++)
			for(int j=1;j+(1<<i)-1<n;j++)
				lc[i][j]=LCA(lc[i-1][j],lc[i-1][j+(1<<i-1)]);
	}
}st;
inline bool cmp1(Rng a,Rng b){
	return a.len>b.len;
}
inline bool cmp2(int i,int j){
	return K[i]>K[j];
}
struct Segment_Tree{
	#define ls (rt<<1)
	#define rs (rt<<1|1)
	int mx[M],m,id;
	inline void pushup(int rt){
		mx[rt]=max(mx[ls],mx[rs]);
	}
	inline void build(int n){
		for(m=1;m<=n;m<<=1);
	}
	inline void modify(int p,int v){
		p+=m,mx[p]=max(mx[p],v);
		for(p>>=1;p;p>>=1) pushup(p);
	}
	inline int query(int l,int r){
		int ans=0;
		for(l+=m-1,r+=m+1;l^r^1;l>>=1,r>>=1){
			if(~l&1) ans=max(ans,mx[l^1]);
			if(r&1) ans=max(ans,mx[r^1]);
		}
		return ans;
	}
}T1,T2;
int main(){
//	printf("%.2lfMb\n",(&stt-&edd)/1024./1024.);
//	system("fc query1.out query1.ans /n");
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		add(u,v),add(v,u);
	}
	dfs(1,1),st.init();
	q=read();
	for(int i=1;i<=q;i++)
		L[i]=read(),R[i]=read(),K[i]=read(),p[i]=i,ans[i]=dep[st.LCAT(L[i],R[i])];
	bool fl=0;
	for(int i=1;i<=q;i++) fl|=K[i]<R[i]-L[i]+1;
	if(!fl){
		for(int i=1;i<=q;i++)
			write(ans[i]),putc('\n');
		return 0;
	}
//	for(int i=1;i<=c;i++)
//		printf("[%d,%d] %d\n",nd[i].l,nd[i].r,nd[i].d);
	sort(nd+1,nd+c+1,cmp1),sort(p+1,p+q+1,cmp2);
//	cerr<<c<<endl;
	T1.build(n),T2.build(n);
//	for(int i=1;i<=q;i++)
//		for(int j=1;j<=c;j++){
////			if(min(R[i],nd[j].r)-max(L[i],nd[j].l)+1>=K[i])
////				ans[i]=max(ans[i],nd[j].d);
//			if(nd[j].len>=K[i]&&L[i]<=nd[j].l&&nd[j].l<=R[i]-K[i]+1)
//				ans[i]=max(ans[i],nd[j].d);
//			if(nd[j].len>=K[i]&&R[i]>=nd[j].r&&nd[j].r>=L[i]+K[i]-1)
//				ans[i]=max(ans[i],nd[j].d);
//		}
	for(int i=1,j=0;i<=q;i++){
		while(j+1<=c&&nd[j+1].len>=K[p[i]]){
			j++;
			T1.modify(nd[j].l,nd[j].d);
			T2.modify(nd[j].r,nd[j].d);
		}
		int id=p[i];
		ans[id]=max({ans[id],T1.query(L[id],R[id]-K[id]+1),T2.query(L[id]+K[id]-1,R[id])});
	}
	for(int i=1;i<=q;i++)
		write(ans[i]),putc('\n');
}
