#include<bits/stdc++.h>
#define sz(x) int(x.size())
#define gc getchar
#define F(i,a,b) for(auto i(a),i##E(b);i<=i##E;i++)
#define UF(i,a,b) for(auto i(a),i##E(b);i>=i##E;i--)
#define all(x) begin(x),end(x)
#define ran(x,l,r) begin(x)+l,begin(x)+r+1
#define sys(x) system(#x)
#define In(x) freopen(x".in","r",stdin)
#define Out(x) freopen(x".out","w",stdout)
#define File(x) (In(x),Out(x))
using namespace std;
using ll=long long;using ull=unsigned long long;
#define vec vector
template<class T>
void operator+=(vec<T> &a,const T &b) {a.push_back(b);}
int read() {
int s=0;char c=gc(),w=0;
while(!isdigit(c)) w=c=='-',c=gc();
while(isdigit(c)) s=s*10+(c-'0'),c=gc();
return w?-s:s;
} const int N=5e5+5,C=2e7+45;
vec<int> G[N];int n,q,fa[N],siz[N],son[N],top[N],dfn[N],dep[N],dfx[N];
void d(int x) {
dep[x]=dep[fa[x]]+1;siz[x]=1;
for(int v:G[x]) if(v^fa[x]) {
fa[v]=x,d(v);
siz[x]+=siz[v];
siz[v]>siz[son[x]]&&(son[x]=v);
}
}
void d2(int x,int t) {
top[x]=t;dfn[x]=++*dfn;dfx[dfn[x]]=x;
if(son[x]) d2(son[x],t);
for(int v:G[x]) if(v^fa[x]&&v^son[x]) d2(v,v);
}
int lca(int x,int y) {
while(top[x]^top[y]) x=fa[top[dep[top[x]]<dep[top[y]]?x^=y^=x^=y:x]];
return dep[x]<dep[y]?x:y;
}
vec<tuple<int,int,int>> V;
struct DS {
int now,pre[N],nxt[N],s[N],t;
void init() {
F(i,1,n+1) pre[i]=i-1,nxt[i-1]=i;
}
void clr() {
while(t) {
int i=s[t--];
nxt[pre[i]]=i;
pre[nxt[i]]=i;
}
}
void ins(int i) {
pre[nxt[i]]=pre[i];
nxt[pre[i]]=nxt[i];
s[++t]=i;
V+=make_tuple(pre[i]+1,nxt[i]-1,dep[now]);
}
} ds;
void dsu_on_tree(int x) {
for(int v:G[x]) if(v^fa[x]&&v^son[x]) {
dsu_on_tree(v);
ds.clr();
}
if(son[x]) dsu_on_tree(son[x]);
ds.now=x;
ds.ins(x);
for(int v:G[x]) if(v^fa[x]&&v^son[x]) {
F(i,dfn[v],dfn[v]+siz[v]-1) {
ds.ins(dfx[i]);
}
}
}
struct DS2 {
int c[N];
void mo(int x,int v) {
x=n-x+1;
for(;x<=n;x+=x&-x) c[x]=max(c[x],v);
}
int que(int x) {
x=n-x+1;int res=0;
for(;x;x&=x-1) res=max(res,c[x]);
return res;
}
void clr(int x) {
x=n-x+1;
for(;x<=n;x+=x&-x) c[x]=0;
}
} ds2,ds3;
struct U {
int l,r,len,val;
} a[C];int e,ans[N];
void cdq(int L,int R) {
if(L==R) return;
int mid=L+R>>1;
cdq(L,mid);cdq(mid+1,R);
int p=L;
F(i,mid+1,R) {
if(a[i].val<0) {
while(p<=mid&&a[p].r>=a[i].r) {
if(a[p].val>0) ds3.mo(a[p].len,a[p].val);
p++;
} ans[-a[i].val]=max(ans[-a[i].val],ds3.que(a[i].len));
}
}
F(i,L,p-1) ds3.clr(a[i].len);
inplace_merge(a+L,a+mid+1,a+R+1,[](const U&a,const U&b){return a.r>b.r;});
}
int main() {
File("query");
F(i,2,n=read()) {
int x=read(),y=read();
G[x]+=y;G[y]+=x;
} d(1);d2(1,1);
ds.init();dsu_on_tree(1);
sort(all(V),[](const tuple<int,int,int>&a,const tuple<int,int,int>&b){
auto&[l,r,v]=a;auto&[L,R,V]=b;
return make_tuple(l,-r,v)<make_tuple(L,-R,V);
});
decltype(V) nV;
F(i,0,sz(V)-1) {
auto[l,r,v]=V[i];
if(ds2.que(r)>=v) continue;
else nV+=V[i],ds2.mo(r,v);
} swap(V,nV);
for(auto[l,r,val]:V) {
a[++e]={l,r,r-l+1,val};
}
F(i,1,q=read()) {
int l=read(),r=read(),k=read();
a[++e]={r-k+1,l+k-1,k,-i};
}
sort(ran(a,1,e),[](const U&a,const U&b){return make_tuple(a.l,-a.r,-a.len,-a.val)<make_tuple(b.l,-b.r,-b.len,-b.val);});
cdq(1,e);
F(i,1,q) printf("%d\n",ans[i]);
return 0;
}