#include <cstdio>
#include <algorithm>

const int N=5e5+10;

struct edge {
	int v,nxt;
}G[N<<1];
int h[N],idx;

void add(int u,int v) {G[++idx]={v,h[u]};h[u]=idx;}

int n;
int dep[N],f[N][20];

void dfs(int u,int fa) {
	dep[u]=dep[fa]+1;f[u][0]=fa;
	for(int i=19;i;i--) f[u][i]=f[f[u][i-1]][i-1];
	for(int i=h[u];i;i=G[i].nxt) {
		int v=G[i].v;if(v==fa) continue;
		dfs(v,u);
	}
}

int lca(int x,int y) {
	if(!x || !y) return x^y;
	if(dep[x]<dep[y]) std::swap(x,y);
	for(int i=19;~i;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(int i=19;~i;i--) {
		if(f[x][i]!=f[y][i]) {
			x=f[x][i];y=f[y][i];
		}
	}
	return f[x][0];
}

struct Seg {
	#define L (tr[p].l)
	#define R (tr[p].r)
	#define ls (p<<1)
	#define rs (p<<1|1)
	
	struct node {
		int l,r,lca;
	}tr[N<<2];
	
	void push_up(int p) {tr[p].lca=lca(tr[ls].lca,tr[rs].lca);}
	
	void build(int p,int l,int r) {
		L=l;R=r;if(l==r) {tr[p].lca=l;return;}
		int mid=(l+r)>>1;build(ls,l,mid);
		build(rs,mid+1,r);push_up(p);
	}
	
	int query(int p,int l,int r) {
		if(l<=L&&R<=r) return tr[p].lca;
		int res=0,mid=(L+R)>>1;
		if(l<=mid) res=lca(query(ls,l,r),res);
		if(mid<r) res=lca(query(rs,l,r),res);
		return res;
	}
	
	#undef L
	#undef R
	#undef ls
	#undef rs
}T;

int main() {
	freopen("query.in","r",stdin);
	freopen("query.out","w",stdout);
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++) {
		scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
	}
	dfs(1,1);T.build(1,1,n);
	int q=0;scanf("%d",&q);
	while(q--) {
		int l,r,k;scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",dep[T.query(1,l,r)]);
	}
	return 0;
}
