#include<bits/stdc++.h>
#define ll int
#define N 500005
using namespace std;
inline char nc(){
static char buf[1000000],*p=buf,*q=buf;
return (p==q)&&(q=(p=buf)+fread(buf,1,1000000,stdin),p==q)?EOF:*p++;
}
inline ll read(){
ll res = 0,w = 1;
char c = nc();
while(c<'0'||c>'9') w=(c=='-'?-1:w),c=nc();
while(c>='0'&&c<='9') res=res*10+c-'0',c=nc();
return res*w;
}
vector<ll> op[N],w1[N],w2[N];
struct seq{ll l,r,dep;}que[N*20];
struct node{ll l,r,k,id;}p[N];
ll n,i,j,x,y,q,ans[N],tr[N],dep[N],sum[N],son[N],fath[N],vis[N],tot,ls[N],rs[N],trr[N<<2],top[N],fathh[N],st[N][21];
inline ll gf(ll x){return x==fath[x]?x:fath[x]=gf(fath[x]);}
inline void add(ll k,ll x){while(k<=n) tr[k]+=x,k+=k&(-k);}
inline ll query(ll k){
ll num = 0;
while(k) num+=tr[k],k-=k&(-k);
return num;
}
inline ll query_seq(ll l,ll r){return query(r)-query(l-1);}
inline void dfs(ll x,ll fa){
fathh[x] = fa;
sum[x] = 1;
for(ll i=0;i<op[x].size();i++){
if(op[x][i]==fa) continue;
dep[op[x][i]] = dep[x]+1;
dfs(op[x][i],x);
sum[x] += sum[op[x][i]];
if(sum[op[x][i]]>sum[son[x]]) son[x]=op[x][i];
}
}
inline void init(ll x,ll topp){
top[x] = topp;
if(son[x]) init(son[x],topp);
for(ll i=0;i<op[x].size();i++){
if(op[x][i]==fathh[x]||op[x][i]==son[x]) continue;
init(op[x][i],op[x][i]);
}
}
inline ll lca(ll x,ll y){
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]]) swap(x,y);
y = fathh[top[y]];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
}
inline void clear(ll x,ll fa){
fath[x] = x,fath[x-1] = x-1,fath[x+1] = x+1,vis[x] = 0;
for(ll i=0;i<op[x].size();i++) if(op[x][i]!=fa) clear(op[x][i],x);
}
inline void merge(ll x,ll y){
x = gf(x),y = gf(y);
fath[x] = y,ls[y] = min(ls[x],ls[y]),rs[y] = max(rs[x],rs[y]);
}
inline void insert(ll x,ll dep){
if(vis[x-1]&&vis[x+1]){
que[++tot] = (seq){ls[gf(x-1)],rs[gf(x+1)],dep};
merge(x-1,x),merge(x,x+1);
}
else if(vis[x-1]){
que[++tot] = (seq){ls[gf(x-1)],x,dep};
merge(x-1,x);
}
else if(vis[x+1]){
que[++tot] = (seq){x,rs[gf(x+1)],dep};
merge(x,x+1);
}
else que[++tot] = (seq){x,x,dep};
vis[x] = 1;
}
inline void dfs2(ll x,ll fa,ll depth){
insert(x,depth);
for(ll i=0;i<op[x].size();i++) if(op[x][i]!=fa) dfs2(op[x][i],x,depth);
}
inline void solve(ll x,ll fa){
for(ll i=0;i<op[x].size();i++){
if(op[x][i]==fa||op[x][i]==son[x]) continue;
solve(op[x][i],x);
clear(op[x][i],x);
}
if(son[x]) solve(son[x],x);
insert(x,dep[x]);
for(ll i=0;i<op[x].size();i++){
if(op[x][i]==fa||op[x][i]==son[x]) continue;
dfs2(op[x][i],x,dep[x]);
}
}
inline void build(ll s,ll t,ll p){
if(s==t){
trr[p] = 0;
return ;
}
build(s,(s+t)/2,2*p),build((s+t)/2+1,t,2*p+1);
trr[p] = max(trr[2*p],trr[2*p+1]);
}
inline void add(ll x,ll c,ll s,ll t,ll p){
if(s==t){
trr[p] = max(trr[p],c);
return ;
}
if(x<=(s+t)/2) add(x,c,s,(s+t)/2,2*p);
else add(x,c,(s+t)/2+1,t,2*p+1);
trr[p] = max(trr[2*p],trr[2*p+1]);
}
inline ll query(ll l,ll r,ll s,ll t,ll p){
if(l<=s&&t<=r) return trr[p];
ll ans = 0;
if(l<=(s+t)/2) ans=max(ans,query(l,r,s,(s+t)/2,2*p));
if(r>(s+t)/2) ans=max(ans,query(l,r,(s+t)/2+1,t,2*p+1));
return ans;
}
inline ll query_lca(ll l,ll r){
ll c = log2(r-l+1);
return lca(st[l][c],st[r-(1<<c)+1][c]);
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(i=1;i<=n+1;i++) fath[i]=i,vis[i]=0,ls[i]=rs[i]=i;
for(i=1;i<n;i++) x=read(),y=read(),op[x].push_back(y),op[y].push_back(x);
q=read();
for(i=1;i<=q;i++) p[i].l=read(),p[i].r=read(),p[i].k=read(),p[i].id=i;
dep[1]=1,dfs(1,-1),solve(1,-1),init(1,1);
for(i=n;i>=1;i--){
st[i][0] = i;
for(j=1;i+(1<<j)-1<=n;j++) st[i][j]=lca(st[i][j-1],st[i+(1<<j-1)][j-1]);
}
for(i=1;i<=tot;i++) w1[que[i].r-que[i].l+1].push_back(i);
for(i=1;i<=q;i++) w2[p[i].k].push_back(i);
build(1,n,1);
for(i=n;i>=1;i--){
for(j=0;j<w1[i].size();j++) add(que[w1[i][j]].r,que[w1[i][j]].dep,1,n,1);
for(j=0;j<w2[i].size();j++) ans[p[w2[i][j]].id]=max(ans[p[w2[i][j]].id],query(p[w2[i][j]].l+p[w2[i][j]].k-1,p[w2[i][j]].r,1,n,1));
}
build(1,n,1);
for(i=n;i>=1;i--){
for(j=0;j<w1[i].size();j++) add(que[w1[i][j]].l,que[w1[i][j]].dep,1,n,1);
for(j=0;j<w2[i].size();j++) ans[p[w2[i][j]].id]=max(ans[p[w2[i][j]].id],query(p[w2[i][j]].l,p[w2[i][j]].r-p[w2[i][j]].k+1,1,n,1));
}
for(i=1;i<=q;i++) ans[i]=max(ans[i],dep[query_lca(p[i].l,p[i].r)]);
for(i=1;i<=q;i++) printf("%d\n",ans[i]);
return 0;
}