#include<bits/stdc++.h>
#define fi first
#define se second
#define vc vector
#define mk make_pair
#define ll long long
#define pb push_back
#define pf push_front
#define PI pair<int,int>
#define err cerr << " -_- " << endl
#define debug cerr << " -------------------------- " << endl
using namespace std;
namespace IO{
inline int read(){
int X=0, W=0; char ch=getchar();
while(!isdigit(ch)) W|=ch=='-', ch=getchar();
while(isdigit(ch)) X=(X<<1)+(X<<3)+(ch^48), ch=getchar();
return W?-X:X;
}
inline void write(int x){
if(x<0) x=-x, putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void sprint(int x){write(x); putchar(32);}
inline void eprint(int x){write(x); putchar(10);}
}using namespace IO;
const int MAXN = 5e5+5;
const int mod = 998244353;
int n, q, de[MAXN], tot, idx[MAXN], ans[MAXN];
int head[MAXN], ne[MAXN<<1], to[MAXN<<1], cnt;
struct seg{
int l, r, v;
}s[MAXN*20];
struct query{
int l, r, k, id;
}Q[MAXN];
set<pair<int,int> > S[MAXN];
set<pair<int,int> > :: iterator A, B;
struct SGT{
int tree[MAXN<<2];
inline void pushup(int p){
tree[p]=max(tree[p<<1],tree[p<<1|1]);
return ;
}
inline void upd(int p, int l, int r, int pos, int v){
int mid;
while(l!=r){
mid=(l+r)>>1;
if(pos<=mid) p=p<<1, r=mid;
else p=p<<1|1, l=mid+1;
}
tree[p]=max(tree[p],v); p>>=1;
while(p) pushup(p), p>>=1;
return ;
}
inline int ask(int p, int l, int r, int L, int R){
if(L<=l && r<=R) return tree[p];
int mid=(l+r)>>1, res=0;
if(L<=mid) res=max(res,ask(p<<1,l,mid,L,R));
if(R>mid) res=max(res,ask(p<<1|1,mid+1,r,L,R));
return res;
}
}T[2];
inline void add(int x, int y){++cnt;to[cnt]=y;ne[cnt]=head[x];head[x]=cnt;}
inline void dfs(int x, int f){
S[x].insert(mk(x,x)); de[x]=de[f]+1;
s[++tot]=seg{x,x,de[x]};
for(int i=head[x];i;i=ne[i]){
if(to[i]==f) continue;
dfs(to[i],x);
int a=idx[x], b=idx[to[i]];
if(S[a].size()<S[b].size()) swap(idx[x],idx[to[i]]), swap(a,b);
for(auto j:S[b]){
A=S[a].lower_bound(j);
if(A==S[a].begin()){
PI aa=*A;
if(aa.fi==j.se+1){
S[a].erase(A);
S[a].insert(mk(j.fi,aa.se));
s[++tot]=seg{j.fi,aa.se,de[x]};
}
else S[a].insert(j);
}
else{
B=A; B--;
if(A==S[a].end()){
PI bb=*B;
if(bb.se==j.fi-1){
S[a].erase(B);
S[a].insert(mk(bb.fi,j.se));
s[++tot]=seg{bb.fi,j.se,de[x]};
}
else S[a].insert(j);
}
else{
PI aa=*A, bb=*B; int L=j.fi, R=j.se;
L=j.fi, R=j.se;
if(aa.fi==R+1){
R=aa.se;
S[a].erase(A);
}
if(bb.se==L-1){
L=bb.fi;
S[a].erase(B);
}
if(L==j.fi && R==j.se) S[a].insert(mk(L,R));
else S[a].insert(mk(L,R)), s[++tot]=seg{L,R,de[x]};
}
}
}
}
return ;
}
inline bool comp(seg x, seg y){return x.r-x.l+1>y.r-y.l+1;}
inline bool comp1(query x, query y){return x.k>y.k;}
inline bool comp2(seg x, seg y){return x.r>y.r;}
inline bool comp3(query x, query y){return x.r>y.r;}
struct BIT{
int tree[MAXN];
inline int lowbit(int x){return x & -x;}
inline void add(int x, int v){while(x<=n) tree[x]=max(tree[x],v), x+=lowbit(x);}
inline int ask(int x){int s=0; while(x) s=max(s,tree[x]), x^=lowbit(x); return s;}
}tr;
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(int i=1;i<=n;++i) idx[i]=i;
for(int i=1;i<n;++i){
int u, v;
u=read(), v=read();
add(u,v), add(v,u);
}
q=read();
for(int i=1;i<=q;++i) Q[i].id=i, Q[i].l=read(), Q[i].r=read(), Q[i].k=read();
dfs(1,0); sort(s+1,s+1+tot,comp); sort(Q+1,Q+1+q,comp1); int now=1;
for(int i=1;i<=tot;++i){
while(now<=q && Q[now].k>s[i].r-s[i].l+1){
ans[Q[now].id]=max(T[0].ask(1,1,n,Q[now].l,Q[now].r-Q[now].k+1),T[1].ask(1,1,n,Q[now].l+Q[now].k-1,Q[now].r));
++now;
}
T[0].upd(1,1,n,s[i].l,s[i].v); T[1].upd(1,1,n,s[i].r,s[i].v);
}
while(now<=q){
ans[Q[now].id]=max(T[0].ask(1,1,n,Q[now].l,Q[now].r-Q[now].k+1),T[1].ask(1,1,n,Q[now].l+Q[now].k-1,Q[now].r));
++now;
}
sort(s+1,s+1+tot,comp2); sort(Q+1,Q+1+q,comp3); now=1;
for(int i=1;i<=tot;++i){
while(now<=q && Q[now].r>s[i].r){
ans[Q[now].id]=max(ans[Q[now].id],tr.ask(Q[now].l));
++now;
}
tr.add(s[i].l,s[i].v);
}
while(now<=q){
ans[Q[now].id]=max(ans[Q[now].id],tr.ask(Q[now].l));
++now;
}
for(int i=1;i<=q;++i) eprint(ans[i]);
return 0;
}