#include <bits/stdc++.h>
inline int read() {
char op=getchar();
int x=0;
while(op<'0'||op>'9') op=getchar();
while(op>='0'&&op<='9') {
x=x*10+op-'0';
op=getchar();
}
return x;
}
int N,Q,ct,dep[500009],hd[500009],to[1000009],nxt[1000009],k,st[500009][19],tt[500009],
as[500009],f[500009],top[500009],pa[500009],son[500009],siz[500009],ls[500009],
rs[500009],sc[500009],ll[500009],rr[500009],anc[500009][19],seg[2000009];
#define md ((l+r)>>1)
void up(int n,int l,int r,int p,int v) {
seg[n]=std::max(seg[n],v);
if(l==r) return;
if(p<=md) up((n<<1),l,md,p,v);else up((n<<1)+1,md+1,r,p,v);
}
int qv(int n,int l,int r,int L,int R) {
if(r<L||R<l) return 0;
if(L<=l&&r<=R) return seg[n];
return std::max(qv(n*2,l,md,L,R),qv(n*2+1,md+1,r,L,R));
}
struct q_t{
int k,l,r,i;
} q[500009];
struct n_t{
int v,l,r;
} hh[500009];
bool cmq(q_t x,q_t y) {
return x.k>y.k;
}
bool cmp(n_t x,n_t y) {
return x.r-x.l+1>y.r-y.l+1;
}
void l(int u,int v) {
to[++k]=v;nxt[k]=hd[u];hd[u]=k;
}
inline int qr(int l,int r) {
int x=tt[r-l+1];
return std::min(st[l][x],st[r-(1<<x)+1][x]);
}
inline int lca(int x,int y) {
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) std::swap(x,y);
x=pa[top[x]];
}
if(dep[x]>dep[y]) std::swap(x,y);
return x;
}
void dfs(int a,int l,int r) {
ll[a]=l;
rr[a]=r;
hh[++ct]=(n_t){a,l,r};
if(ls[a]) {
dep[ls[a]]=dep[a]+1;
dfs(ls[a],l,a-1);
}
if(rs[a]) {
dep[rs[a]]=dep[a]+1;
dfs(rs[a],a+1,r);
}
}
void dfs1(int n,int f) {
pa[n]=f;siz[n]=1;dep[n]=dep[f]+1;
for(int i=hd[n];i;i=nxt[i]) {
if(to[i]==f) continue;
dfs1(to[i],n);
siz[n]+=siz[to[i]];
if(siz[son[n]]<siz[to[i]]) son[n]=to[i];
}
}
void dfs2(int n,int tp) {
top[n]=tp;
if(son[n]) dfs2(son[n],tp);
for(int i=hd[n];i;i=nxt[i]) {
if(to[i]==pa[n]||to[i]==son[n]) continue;
dfs2(to[i],to[i]);
}
}
inline int lca2(int x,int y) {
while(x!=y) {
if(dep[x]<dep[y]) std::swap(x,y);
x=pa[x];
}
return x;
}
signed main(void) {
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
N=read();
for(int i=2;i<=N;i++) tt[i]=tt[i/2]+1;
for(int i=1;i<N;i++) {
int u=read(),v=read();
l(u,v),l(v,u);
}
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=N;i++) st[i][0]=-dep[i];
for(int i=1;i<=18;i++) {
for(int j=1;j+(1<<i)-1<=N;j++) {
st[j][i]=std::min(st[j][i-1],st[j+(1<<i-1)][i-1]);
}
}
for(int i=1;i<N;i++) {
f[i]=dep[lca(i,i+1)];
}
Q=read();
for(int i=1;i<=Q;i++) {
q[i].l=read();
q[i].r=read();
q[i].k=read();
q[i].i=i;
if(q[i].k==1) {
as[i]=-qr(q[i].l,q[i].r);
q[i].k=0;
} else {
q[i].r--;
q[i].k--;
}
}
N--;
int k=0;
for(int i=1;i<=N;i++) {
int tp=k;
while(k&&f[sc[k]]>f[i]) {
k--;
}
if(k<tp) {
ls[i]=sc[k+1];
}
if(k) {
rs[sc[k]]=i;
}
sc[++k]=i;
}
for(int i=1;i<=N;i++) st[i][0]=f[i],pa[i]=0;
for(int i=1;i<=18;i++) {
for(int j=1;j+(1<<i)-1<=N;j++) {
st[j][i]=std::min(st[j][i-1],st[j+(1<<i-1)][i-1]);
}
}
for(int i=1;i<=N;i++) {
pa[ls[i]]=i;
}
for(int i=1;i<=N;i++) {
pa[rs[i]]=i;
}
for(int i=1;i<=N;i++) anc[i][0]=pa[i];
for(int i=1;i<=18;i++) {
for(int j=1;j<=N;j++) {
anc[j][i]=anc[anc[j][i-1]][i-1];
}
}
dep[sc[1]]=1;
dfs(sc[1],1,N);
std::sort(q+1,q+Q+1,cmq);
std::sort(hh+1,hh+N+1,cmp);
int le=0;
for(int i=1;i<=Q;i++) {
if(q[i].k==0) break;
while(le<N&&hh[le+1].r-hh[le+1].l+1>=q[i].k) {
le++;
int x=hh[le].v;
up(1,1,N,x,f[x]);
}
int x=q[i].l,y=q[i].r,ans=0,tp=q[i].k;
for(int j=18;j>=0;j--) {
int qq=anc[x][j];
if(qq&&rr[qq]-q[i].l+1<tp) x=qq;
}
if(rr[x]-q[i].l+1<tp) x=pa[x];
for(int j=18;j>=0;j--) {
int qq=anc[y][j];
if(qq&&q[i].r-ll[qq]+1<tp) y=qq;
}
if(q[i].r-ll[y]+1<tp) y=pa[y];
ans=std::max(ans,qv(1,1,N,x,y));
as[q[i].i]=ans;
}
for(int i=1;i<=Q;i++) {
printf("%d\n",as[i]);
}
}