#include<bits/stdc++.h>
using namespace std;
#define ll int
const ll inf = 1e9;
#define Max(x,y) x = max(x,y)
#define Min(x,y) x = min(x,y)
#define fr(i,l,r) for (i=(l); i<=(r); i++)
#define rfr(i,l,r) for (i=(l); i>=(r); i--)
template<typename T>inline void read(T &n){
T w = 1; n = 0; char ch = getchar();
while (!isdigit(ch) && ch!=EOF){
if (ch=='-') w = -1;
ch = getchar();
}
while (isdigit(ch) && ch!=EOF){
n = n*10 + ch-'0';
ch = getchar();
}
n *= w;
}
template<typename T>inline void write(T x){
if (x==0){ putchar('0'); return ; }
T tmp = x;
if (x<0) putchar('-'), tmp = -x;
ll cnt = 0; char F[45];
while (tmp>0) F[++cnt] = tmp%10, tmp /= 10;
while (cnt>0) putchar(F[cnt--]+'0');
}
const ll N = 500005;
ll n,m;
ll qs,ql[N],qr[N],qk[N],af[N];
struct edge{
ll x,y;
};
ll cnt,head[N]; edge e[N+N];
void addedge(ll x,ll y){
cnt++;
e[cnt].x = head[x];
e[cnt].y = y;
head[x] = cnt;
}
ll ft[N],dep[N];
ll sz[N],ms[N];
ll top[N];
void dfs(ll x,ll fa){
ft[x] = fa;
ll i, go;
sz[x] = 1, ms[x] = -1;
for (i=head[x]; i; i=e[i].x){
go = e[i].y;
if (go==fa) continue;
dep[go] = dep[x]+1;
dfs(go,x);
sz[x] += sz[go];
if (ms[x]==-1 || sz[go]>sz[ms[x]]) ms[x] = go;
}
}
void dfs2(ll x,ll lt){
top[x] = lt;
ll i, go;
if (ms[x]==-1) return ;
dfs2(ms[x],lt);
for (i=head[x]; i; i=e[i].x){
go = e[i].y;
if (go==ft[x] || go==ms[x]) continue;
dfs2(go,go);
}
}
ll v[N];
ll Lca(ll x,ll y){
while (top[x]!=top[y]){
if (dep[top[x]]<dep[top[y]]) swap(x,y);
x = ft[top[x]];
}
if (dep[x]<dep[y]) return x; else return y;
}
ll lf[N],rh[N],d[N];
ll sum,q[N];
void init(){
ll i,j;
sum = 0; q[0] = 0;
fr(i,1,n-1){
while (sum>0 && v[i]<v[q[sum]]){
rh[q[sum]] = i-1;
sum--;
}
lf[i] = q[sum]+1;
q[++sum] = i;
}
while (sum>0) rh[q[sum]] = n-1, sum--;
}
struct Tree{
struct node{
ll l,r,v;
}t[4*N];
void build(ll s,ll l,ll r,bool flag){
t[s].l = l, t[s].r = r;
t[s].v = -inf;
if (l==r){
if (flag) t[s].v = dep[l];
return ;
}
ll mid = (l+r)>>1;
build(s*2,l,mid,flag);
build(s*2+1,mid+1,r,flag);
if (flag) t[s].v = max(t[s*2].v,t[s*2+1].v);
}
void change(ll s,ll x,ll v){
if (t[s].l==t[s].r){
Max(t[s].v,v);
return ;
}
if (t[s*2].r>=x) change(s*2,x,v);
else change(s*2+1,x,v);
t[s].v = max(t[s*2].v,t[s*2+1].v);
}
ll qry(ll s,ll l,ll r){
if (t[s].l>=l && t[s].r<=r) return t[s].v;
ll ans = -inf;
if (t[s*2].r>=l) Max( ans , qry(s*2,l,r) );
if (t[s*2+1].l<=r) Max( ans , qry(s*2+1,l,r) );
return ans;
}
}tr;
struct Tree2{
struct node{
ll l,r,v;
}t[4*N];
void build(ll s,ll l,ll r){
t[s].l = l, t[s].r = r;
if (l==r){
t[s].v = v[l];
return ;
}
ll mid = (l+r)>>1;
build(s*2,l,mid);
build(s*2+1,mid+1,r);
t[s].v = min(t[s*2].v,t[s*2+1].v);
}
void change(ll s,ll x,ll v){
if (t[s].l==t[s].r){
Min(t[s].v,v);
return ;
}
if (t[s*2].r>=x) change(s*2,x,v);
else change(s*2+1,x,v);
t[s].v = min(t[s*2].v,t[s*2+1].v);
}
ll qry(ll s,ll l,ll r){
if (t[s].l>=l && t[s].r<=r) return t[s].v;
ll ans = inf;
if (t[s*2].r>=l) Min( ans , qry(s*2,l,r) );
if (t[s*2+1].l<=r) Min( ans , qry(s*2+1,l,r) );
return ans;
}
}tr2;
struct Spe_work{
void main(){
ll i,j;
tr.build(1,1,n,1);
fr(i,1,qs)
if (qk[i]==1) af[i] = tr.qry(1,ql[i],qr[i]);
}
}spe_wrk;
struct Work1{
void main(){
ll i,j;
tr2.build(1,1,n-1);
fr(i,1,qs)
if (qk[i]>1){
ll l = ql[i], r = qr[i]-1, k = qk[i]-1;
Max( af[i] , tr2.qry(1,l,l+k-1) );
Max( af[i] , tr2.qry(1,r-k+1,r) );
}
}
}wrk1;
struct Work2{
struct opert{
ll op;
ll x;
ll l,r;
ll v;
bool operator < (const opert o){
if (x==o.x) return op<o.op;
else return x>o.x;
}
};
ll cnt; opert o[N+N];
void main(){
ll i,j;
cnt = 0;
fr(i,1,qs){
if (qk[i]==1) continue;
cnt++;
o[cnt].op = 2;
o[cnt].x = qk[i]-1;
o[cnt].l = ql[i], o[cnt].r = qr[i]-qk[i]+1;
o[cnt].v = i;
}
fr(i,1,n-1){
cnt++;
o[cnt].op = 1;
o[cnt].x = rh[i]-lf[i]+1;
o[cnt].l = lf[i];
o[cnt].v = v[i];
}
sort(o+1,o+1+cnt);
tr.build(1,1,n-1,false);
fr(i,1,cnt){
ll x = o[i].x, v = o[i].v;
if (o[i].op==1){
tr.change(1,o[i].l,v);
}
else {
Max( af[v] , tr.qry(1,o[i].l,o[i].r) );
}
}
}
}wrk2;
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
ll i,j;
read(n);
fr(i,2,n){
ll x,y;
read(x); read(y);
addedge(x,y);
addedge(y,x);
}
dep[1] = 1;
dfs(1,-1);
dfs2(1,1);
fr(i,1,n-1) v[i] = dep[Lca(i,i+1)];
init();
read(qs);
fr(i,1,qs) read(ql[i]), read(qr[i]), read(qk[i]);
spe_wrk.main();
wrk1.main();
wrk2.main();
fr(i,1,qs) write(af[i]), putchar('\n');
return 0;
}