#include<bits/stdc++.h>
const int N=5e5;
int read(){
char c=getchar();int x=0;
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
int Max(int x,int y){return x<y?y:x;}
struct XRS{
int tr[N*4+5];
void build(int l,int r,int now){
tr[now]=0;
if(l==r)return;
int mid=l+r>>1;
build(l,mid,now<<1),build(mid+1,r,now<<1|1);
}
void chan(int l,int r,int now,int x,int y){
if(l==r){
tr[now]=y;
return;
}
int mid=l+r>>1;
if(mid>=x)chan(l,mid,now<<1,x,y);
else chan(mid+1,r,now<<1|1,x,y);
tr[now]=Max(tr[now<<1],tr[now<<1|1]);
}
int find(int l,int r,int now,int L,int R){
if(l>=L&&r<=R)return tr[now];
int mid=l+r>>1,s=0;
if(mid>=L)s=Max(s,find(l,mid,now<<1,L,R));
if(mid<R)s=Max(s,find(mid+1,r,now<<1|1,L,R));
return s;
}
}xrs;
int n,a[N+5],q,b[N+5],ans[N+5];
struct node{
int l,r,x,id;
}h[N+5];
struct node2{
int l,r,x;
}g[N+5];
namespace task4{
void work(){
xrs.build(1,n,1);
for(int i=n-1,j=q;i;--i){
while(j&&h[j].x>g[i].r-g[i].l+1){
ans[h[j].id]=Max(ans[h[j].id],xrs.find(1,n,1,h[j].l,h[j].r-h[j].x+1));
--j;
}
xrs.chan(1,n,1,g[i].l,a[g[i].x]);
if(i==1){
while(j){
if(!h[j].x){
--j;
continue;
}
ans[h[j].id]=Max(ans[h[j].id],xrs.find(1,n,1,h[j].l,h[j].r-h[j].x+1));
--j;
}
}
}
}
}
namespace task3{
bool cmp(node2 A,node2 B){return A.r-A.l==B.r-B.l?A.l<B.l:A.r-A.l<B.r-B.l;}
bool cmp2(node A,node B){return A.x<B.x;}
void work(){
xrs.build(1,n,1);
std::sort(g+1,g+n,cmp);
std::sort(h+1,h+q+1,cmp2);
for(int i=n-1,j=q;i;--i){
while(j&&h[j].x>g[i].r-g[i].l+1){
ans[h[j].id]=Max(ans[h[j].id],xrs.find(1,n,1,h[j].l+h[j].x-1,h[j].r));
--j;
}
xrs.chan(1,n,1,g[i].r,a[g[i].x]);
if(i==1){
while(j){
if(!h[j].x){
--j;
continue;
}
ans[h[j].id]=Max(ans[h[j].id],xrs.find(1,n,1,h[j].l+h[j].x-1,h[j].r));
--j;
}
}
}
}
}
namespace task2{
bool cmp(node2 A,node2 B){return A.r<B.r;}
bool cmp2(node A,node B){return A.r<B.r;}
void work(){
xrs.build(1,n,1);
std::sort(g+1,g+n,cmp);
std::sort(h+1,h+q+1,cmp2);
for(int i=n-1,j=q;i;--i){
while(j&&h[j].r>g[i].r){
ans[h[j].id]=Max(ans[h[j].id],xrs.find(1,n,1,1,h[j].l));
--j;
}
xrs.chan(1,n,1,g[i].l,a[g[i].x]);
if(i==1){
while(j){
if(!h[j].x){
--j;
continue;
}
ans[h[j].id]=Max(ans[h[j].id],xrs.find(1,n,1,1,h[j].l));
--j;
}
}
}
}
}
namespace task1{
void work(){
xrs.build(1,n,1);
for(int i=1;i<=n;++i)xrs.chan(1,n,1,i,b[i]);
for(int i=1;i<=q;++i)if(h[i].x==1){
ans[i]=xrs.find(1,n,1,h[i].l,h[i].r);
}
}
}
namespace init{
int first[N+5],to[N*2+5],nxt[N*2+5],num,fa[N+5],sz[N+5],tp[N+5],sn[N+5],dep[N+5];
void add(int x,int y){to[++num]=y,nxt[num]=first[x],first[x]=num;}
void dfs(int x,int y){
fa[x]=y,sz[x]=1,dep[x]=dep[y]+1;
for(int i=first[x];i;i=nxt[i])if(to[i]!=y){
dfs(to[i],x),sz[x]+=sz[to[i]];
if(sz[to[i]]>sz[sn[x]])sn[x]=to[i];
}
}
void dfs2(int x,int tf){
tp[x]=tf;
if(sn[x])dfs2(sn[x],tf);
for(int i=first[x];i;i=nxt[i])if(to[i]!=fa[x]&&to[i]!=sn[x])dfs2(to[i],to[i]);
}
void Swap(int &x,int &y){x^=y^=x^=y;}
int LCA(int x,int y){
while(tp[x]!=tp[y]){
if(dep[tp[x]]<dep[tp[y]])Swap(x,y);
x=fa[tp[x]];
}
return dep[x]<dep[y]?x:y;
}
void work(){
for(int i=1,u,v;i<n;++i){
u=read(),v=read();
add(u,v),add(v,u);
}
dfs(1,0),dfs2(1,1);
for(int i=1;i<n;++i)a[i]=dep[LCA(i,i+1)];
for(int i=1;i<=n;++i)b[i]=dep[i];
}
}
int id[N+5];
bool cmp(int x,int y){return a[x]==a[y]?x<y:a[x]<a[y];}
struct bcj{
int fa[N+5];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void init(){
for(int i=1;i<=n+1;++i)fa[i]=i;
}
}b1,b2;
int t[N+5];
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
init::work();
q=read();
for(int i=1;i<=q;++i){
h[i].l=read(),h[i].r=read(),h[i].x=read();
h[i].id=i;
}
task1::work();
for(int i=1;i<=q;++i)--h[i].r,--h[i].x;
for(int i=1;i<n;++i)id[i]=i;
std::sort(id+1,id+n,cmp);
b1.init(),b2.init();
for(int ii=n-1,i;ii;--ii){
i=id[ii];
int r=b1.find(i+1)-1,l=b2.find(i-1)+1;
g[ii].l=l,g[ii].r=r,g[ii].x=i;
b1.fa[i]=r+1;
b2.fa[i]=l-1;
}
task2::work();
task3::work();
task4::work();
for(int i=1;i<=q;++i)printf("%d\n",ans[i]);
return 0;
}