#include <bits/stdc++.h>
#define ll long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
inline static int read(){
int sum=0,ch=getchar(),neg=0;
while(!isdigit(ch)) neg=(ch=='-'),ch=getchar();
while(isdigit(ch)) sum=sum*10+(ch^48),ch=getchar();
return neg?-sum:sum;
}
struct{int v,nxt;}e[1000005]; int n,q,N,head[500005],deg[500005],ecnt;
void add(int u,int v){e[++ecnt]={v,head[u]},head[u]=ecnt;}
int dep[500005];
namespace LCA{
int check(int u,int v){return dep[u]<dep[v]?u:v;}
int st[20][1000005],pos[500005],l;
void init(){
for(int i=1,w=1;i<20;i++,w<<=1) for(int j=1;j+w<=l;j++)
st[i][j]=check(st[i-1][j],st[i-1][j+w]);
}
int lca(int u,int v){
int l=pos[u],r=pos[v]; if(l>r) swap(l,r); int lg=__lg(r-l+1);
return check(st[lg][l],st[lg][r-(1<<lg)+1]);
}
void dfs(int u,int fa){
st[0][++l]=u,pos[u]=l,dep[u]=dep[fa]+1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v; if(v==fa) continue;
dfs(v,u),st[0][++l]=u;
}
}
}
using LCA::lca;
namespace bf{
int st[19][500005];
int query(int l,int r){
int lg=__lg(r-l+1);
return lca(st[lg][l],st[lg][r-(1<<lg)+1]);
}
void init(){
iota(st[0],st[0]+n+1,0);
for(int i=1,w=1;i<19;i++,w<<=1) for(int j=1;j+w<=n;j++)
st[i][j]=lca(st[i-1][j],st[i-1][j+w]);
}
void solve(){
for(int i=1,l,r,k;i<=q;i++){
l=read(),r=read(),k=read(); int ans=0;
for(int j=l+k-1;j<=r;j++) ans=max(dep[query(j-k+1,j)],ans);
printf("%d\n",ans);
}
}
}
int ans[500005];
struct{int p,x;}st[500005]; int tp;
struct Qry{int l,r,k,i;}qry[500005]; int qcnt;
struct Modify{int l,r,x;}arr[1000005]; int mcnt;
struct zkw{
int node[1<<20];
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
int query(int l,int r,int ret=0){
for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){
if((l&1)==0) ret=max(ret,node[l^1]);
if((r&1)==1) ret=max(ret,node[r^1]);
} return ret;
}
void update(int p,int x){
for(p+=N;p;p>>=1) node[p]=max(node[p],x);
}
}L,R;
signed main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read(),N=1<<__lg(n+1)+1;
for(int i=1,u,v;i<n;i++) u=read(),v=read(),add(u,v),add(v,u);
LCA::dfs(1,0),LCA::init(),bf::init(),q=read();
if(n<=5000 && q<=5000) return bf::solve(),0;
for(int i=1,l,r,k;i<=q;i++){
l=read(),r=read(),k=read(),ans[i]=dep[bf::query(l,r)];
if(r-l+1>k) qry[++qcnt]={l,r,k,i};
}
if(qcnt){
sort(qry+1,qry+qcnt+1,[](Qry a,Qry b){return a.k>b.k;});
for(int i=1;i<=n;i++){
while(tp>1 && lca(st[tp-1].x,i) == lca(st[tp].x,i))
arr[++mcnt]={st[tp].p,i-1,st[tp].x},tp--;
if(tp) arr[++mcnt]={st[tp].p,i-1,st[tp].x},st[tp].x=lca(st[tp].x,i);
if(st[tp].x!=i) st[++tp]={i,i};
} while(tp) arr[++mcnt]={st[tp].p,n,st[tp].x},tp--;
sort(arr+1,arr+mcnt+1,[](Modify a,Modify b){return a.r-a.l>b.r-b.l;});
for(int i=1,p=1;i<=qcnt;i++){
for(;p<=mcnt && arr[p].r-arr[p].l+1>=qry[i].k;p++)
L.update(arr[p].l,dep[arr[p].x]),R.update(arr[p].r,dep[arr[p].x]);
int A=L.query(qry[i].l,qry[i].r-qry[i].k+1),B=R.query(qry[i].l+qry[i].k-1,qry[i].r);
ans[qry[i].i]=max({ans[qry[i].i],A,B});
}
} for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
return 0;
}