#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 500005
#define M 20
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
int n,m,f[N][M],u,v,k,dep[N],ans,tr[N<<2];
vector<int>s[N];
void dfs(int x,int y){
	dep[x]=dep[y]+1,f[x][0]=y;
	for(int i=1;i<M;i++) f[x][i]=f[f[x][i-1]][i-1];
	for(auto i:s[x]) if(i!=y) dfs(i,x);
	return;
}int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=M-1;i>=0;i--) if(dep[x]-(1<<i)>=dep[y]) x=f[x][i];
	for(int i=M-1;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return x==y?x:f[x][0];
}void push_up(int x){tr[x]=max(tr[ls(x)],tr[rs(x)]);return;}
void build(int x,int l,int r){
	if(l==r){tr[x]=dep[l];return;}
	int mid=(l+r)>>1;
	build(ls(x),l,mid),build(rs(x),mid+1,r),push_up(x);
	return;
}int query(int x,int l,int r,int L,int R){
	if(L<=l&&r<=R) return tr[x];int mid=(l+r)>>1,res=0;
	if(L<=mid) res=query(ls(x),l,mid,L,R);if(R>mid) res=max(res,query(rs(x),mid+1,r,L,R));
	return res;
}
int main(){
	freopen("query.in","r",stdin),freopen("query.out","w",stdout);
	scanf("%d",&n),dep[0]=-1;
	for(int i=1;i<n;i++) scanf("%d%d",&u,&v),s[u].push_back(v),s[v].push_back(u);
	scanf("%d",&m),dfs(1,0),build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&u,&v,&k);
		printf("%d\n",query(1,1,n,u,v));
	}
	fclose(stdin),fclose(stdout);
	return 0;
} 
