#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define PII pair<int,int>
using namespace std;
namespace Read{
inline int read(){
int f=0,d=1; char op;
while(op=getchar(),!isdigit(op)) if(op=='-') d=-1;
while(isdigit(op)) f=(f<<1)+(f<<3)+(op^48),op=getchar();
return f*d;
}
} using namespace Read;
namespace YYY{
const int N=5e5+10,M=20;
int h[N],ne[2*N],e[2*N],idx;
int fl[N][M],dep[N];
int ans[N];
int tmp[N],last[N],now[N];
int stk[N],ed;
int yjf[N],idx_yjf,ddd[N],idx_ddd;
struct Que{
int op,l,r;
};
struct Tree{
int maxx;
}tree[4*N];
vector<Que> v[N];
void add(int x,int y){
e[++idx]=y;
ne[idx]=h[x];
h[x]=idx;
}
void dfs(int u,int last,int depth){
dep[u]=depth;
for(int i=h[u];i!=-1;i=ne[i]){
if(e[i]!=last){
fl[e[i]][0]=u;
for(int j=1;j<M;j++){
fl[e[i]][j]=fl[fl[e[i]][j-1]][j-1];
}
dfs(e[i],u,depth+1);
}
}
}
void up(int k){
tree[k].maxx=max(tree[2*k].maxx,tree[2*k+1].maxx);
}
void build(int k,int l,int r){
if(l==r){
tree[k].maxx=dep[l];
return ;
}
int mid=(l+r)>>1;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
up(k);
}
void build2(int k,int l,int r){
if(l==r){
tree[k].maxx=tmp[l];
return ;
}
int mid=(l+r)>>1;
build2(2*k,l,mid);
build2(2*k+1,mid+1,r);
up(k);
}
void modify(int k,int l,int r,int L,int d){
if(r<L || L<l) return ;
if(l==r){
tree[k].maxx=d;
return ;
}
int mid=(l+r)>>1;
modify(2*k,l,mid,L,d);
modify(2*k+1,mid+1,r,L,d);
up(k);
}
int query(int k,int l,int r,int L,int R){
if(r<L || R<l) return 0;
if(L<=l && r<=R) return tree[k].maxx;
int mid=(l+r)>>1;
return max(query(2*k,l,mid,L,R),query(2*k+1,mid+1,r,L,R));
}
int Lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
int tmp=dep[x]-dep[y];
int k=0;
while(tmp){
if(tmp&1){
x=fl[x][k];
}
k++;
tmp>>=1;
}
if(x==y) return x;
k=M-1;
while(k>=0){
if(fl[x][k]!=fl[y][k]){
x=fl[x][k];
y=fl[y][k];
}
k--;
}
return fl[x][0];
}
signed main(){
memset(h,-1,sizeof(h));
int n; n=read();
int x,y,z;
for(int i=1;i<n;i++){
x=read(),y=read();
add(x,y);
add(y,x);
}
dfs(1,-1,1);
int t; t=read();
for(int i=1;i<=t;i++){
x=read(),y=read(),z=read();
v[z].push_back({i,x,y});
}
build(1,1,n);
for(int i=0;i<(int)v[1].size();i++){
ans[v[1][i].op]=query(1,1,n,v[1][i].l,v[1][i].r);
}
for(int i=1;i<n;i++){
tmp[i]=dep[Lca(i,i+1)];
}
for(int i=1;i<n;i++){
while(ed!=0 && tmp[stk[ed]]>tmp[i]){
ed--;
}
last[i]=stk[ed]+1;
stk[++ed]=i;
}
build2(1,1,n-1);
for(int i=1;i<n;i++){
now[i]=i;
yjf[++idx_yjf]=i;
}
for(int i=2;i<=n;i++){
for(int j=0;j<(int)v[i].size();j++){
ans[v[i][j].op]=query(1,1,n-1,v[i][j].l,v[i][j].r-i+1);
}
idx_ddd=0;
for(int j=1;j<=idx_yjf;j++){
now[yjf[j]]--;
if(now[yjf[j]]>=last[yjf[j]]){
modify(1,1,n-1,now[yjf[j]],tmp[yjf[j]]);
ddd[++idx_ddd]=yjf[j];
}
}
idx_yjf=idx_ddd;
for(int j=1;j<=idx_yjf;j++){
yjf[j]=ddd[j];
}
}
for(int i=1;i<=t;i++){
printf("%d\n",ans[i]);
}
return 0;
}
}
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
return YYY::main();
}