#include<bits/stdc++.h>
using namespace std;
int read() {
	int x=0, w=1; char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') w=-1; ch=getchar();}
	while(isdigit(ch)) {x=x*10+(ch-'0'); ch=getchar();}
	return x*w;
}
const int N=5e5+10;
const int inf=0x3f3f3f3f;
int n, cd[N];
struct edge{int x, y, pre;} a[N<<1]; int alen, last[N];
void ins(int x, int y) {a[++alen]={x, y, last[x]}; last[x]=alen;}
int dep[N], f[N][30];
void prepare(int x, int fa) {
	dep[x]=dep[fa]+1; f[x][0]=fa;
	for(int i=1;i<=20;i++) f[x][i]=f[f[x][i-1]][i-1];
	for(int k=last[x];k;k=a[k].pre) {
		int y=a[k].y;
		if(y==fa) continue;
		prepare(y, x);
	}
}	
int LCA(int x, int y) {
	if(dep[x]<dep[y]) swap(x, y);
	for(int i=20;i>=0;i--) 
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return y;
	for(int i=20;i>=0;i--)
		if(f[x][i]!=f[y][i]) x=f[x][i], y=f[y][i];
	return f[x][0];
}
struct trnode{int l, r, lc, rc, mx, mxx, c, cc;} tr[N<<1]; int trlen;
#define lc(x) tr[x].lc
#define rc(x) tr[x].rc
trnode pushup(trnode x, trnode y) {
	trnode t;
	if(x.mx>y.mx) {
		t.mx=x.mx; t.c=x.c;
		if(x.c>1) t.mxx=x.mx, t.cc=x.c-1;
		else {
			if(x.mxx>y.mx) t.mxx=x.mxx, t.cc=x.cc;
			else if(x.mxx<y.mx) t.mxx=y.mx, t.cc=y.c;
			else t.mxx=y.mx, t.cc=y.c+x.cc;
		}
	}
	if(x.mx<y.mx) {
		t.mx=y.mx; t.c=y.c;
		if(x.c>1) t.mxx=y.mx, t.cc=y.c-1;
		else {
			if(y.mxx>x.mx) t.mxx=y.mxx, t.cc=y.cc;
			else if(y.mxx<x.mx) t.mxx=x.mx, t.cc=x.c;
			else t.mxx=y.mxx, t.cc=y.cc+x.c;
		}
	}
	if(x.mx==y.mx) {
		t.mx=t.mxx=x.mx;
		t.c=x.c+y.c;
		t.cc=x.c+y.c-1;
	}
	return t;
}
void build(int l, int r) {
	int now=++trlen;
	tr[now]={l, r, -1, -1, 0, 0, 0, 0};
	if(l==r) {
		tr[now].mx=dep[l]; tr[now].c=1;
		return ;
	}
	int mid=(l+r)>>1;
	tr[now].lc=trlen+1, build(l, mid);
	tr[now].rc=trlen+1, build(mid+1, r);
	trnode t=pushup(tr[lc(now)], tr[rc(now)]);
	tr[now].c=t.c; tr[now].cc=t.cc;
	tr[now].mx=t.mx; tr[now].mxx=t.mxx;
}
trnode query(int now, int l, int r) {
	if(l<=tr[now].l&&r>=tr[now].r) {
		return tr[now];
	}
	int mid=(tr[now].l+tr[now].r)>>1;
	trnode ans={0, 0, 0, 0, 0, 0, 0, 0};
	if(l<=mid) {
		ans=pushup(ans, query(lc(now), l, r));
	}
	if(r>mid) {
		ans=pushup(ans, query(rc(now), l, r));
	}	
	return ans;
}
void sub1() {
	int q; q=read();
	build(1, n); 
	while(q--) {
		int l=read(), r=read(), k=read();
		printf("%d\n", query(1, l, r).mxx);
	}
}
int main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	n=read(); alen=1; memset(last, 0, sizeof(last));
	for(int i=1,x,y;i<n;i++) {
		x=read(); y=read();
		ins(x, y); ins(y, x);
		cd[x]++; cd[y]++;
	}
	int cnt1=0, cnt2=0;
	for(int i=1;i<=n;i++) {
		(cd[i]==1)?cnt1++:cnt2++;
	}
	prepare(1, 0);
	if(cnt1==2&&cnt2==n-2) {sub1(); return 0;}
	int q; q=read();
	while(q--) {
		int x=read(), y=read(), k=read();
		int ans=0;
		for(int i=x;i<=y;i++) 
			for(int j=x;j<=y;j++) {
				int p=LCA(i, j);
				if(dep[i]+dep[j]-dep[p]*2+1<k) continue;
				ans=max(ans, dep[p]);
			}
		printf("%d\n", ans);
	}
	return 0;
} 
