#include<bits/stdc++.h>
using namespace std;
constexpr int M=5e5+5;
int n,q,num,tr[M<<1],dep[M],ans[M],st[20][M];
vector<int>adj[M];set<pair<int,int>>s[M];
struct info{int op,a,b,c,v;};vector<info>vec;
int read(){
int x=0;char ch=getchar();
while (!isdigit(ch)) ch=getchar();
while (isdigit(ch)) x=x*10+ch-48,ch=getchar();
return x;
}
int tp,idx,fa[M],stk[M],idfn[M];
void init(int x){
s[x].insert(make_pair(x,x));
vector<pair<int,int>>tmp;
for (auto y:adj[x])
if (y!=fa[x]){
if (s[x].size()<s[y].size()) swap(s[x],s[y]);
for (auto [xl,xr]:s[y]){ int l=xl,r=xr;
auto it=s[x].lower_bound(make_pair(l,r));
bool flagl=it!=s[x].begin()&&(*prev(it)).second+1==l;
bool flagr=it!=s[x].end()&&(*it).first-1==r;
if (flagl) l=(*prev(it)).first;
if (flagr) r=(*it).second;
if (flagl&&flagr) it--,it=s[x].erase(it),s[x].erase(it);
else if (flagl) s[x].erase(prev(it));
else if (flagr) s[x].erase(it);
if (flagl||flagr) tmp.emplace_back(l,r);
s[x].insert(make_pair(l,r));
}
}
sort(tmp.begin(),tmp.end(),[&](const pair<int,int>a,const pair<int,int>b)
{return a.first==b.first?a.second>b.second:a.first<b.first;});
int cur=0;for (auto [l,r]:tmp) if (r>cur)
vec.push_back({0,-(r-l+1),l,-r,dep[x]}),cur=r;
}
void dfs(){
stk[tp=1]=1; while (tp){
const int x=stk[tp--];
idfn[++idx]=x;dep[x]=dep[fa[x]]+1;
for (auto y:adj[x]){
if (y==fa[x]) continue;
fa[y]=x;stk[++tp]=y;
}
}
for (int i=n;i;i--) init(idfn[i]);
for (int i=1;i<=n;i++) st[0][i]=dep[i];
}
int queryst(int l,int r){
int k=31^__builtin_clz(r-l+1);
return max(st[k][l],st[k][r+1-(1<<k)]);
}
void update(int x,int p){while (x<=num) tr[x]=max(tr[x],p),x+=x&-x;}
int query(int x){int res=0;while (x) res=max(res,tr[x]),x-=x&-x;return res;}
void clear(int x){while (x<=num&&tr[x]) tr[x]=0,x+=x&-x;}
bool cmp(const info &x,const info &y){return x.b<y.b;}
void solve(int l,int r){
if (l==r) return;int mid=l+r>>1;
solve(l,mid);solve(mid+1,r);
for (int i=mid+1,j=l;i<=r;i++){
while (j<=mid&&(vec[j].op||vec[j].b<=vec[i].b)){
if (!vec[j].op) update(vec[j].c,vec[j].v);j++;
}
if (vec[i].op) ans[vec[i].v]=max(ans[vec[i].v],query(vec[i].c));
}
for (int i=l;i<=mid;i++) clear(vec[i].c);
inplace_merge(vec.begin()+l,vec.begin()+mid+1,vec.begin()+r+1,cmp);
for (int i=l;i<r;i++) assert(vec[i].b<=vec[i+1].b);
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for (int i=1;i<n;i++){
int x=read(),y=read();
adj[x].emplace_back(y);
adj[y].emplace_back(x);
}
dfs();q=read();int lg=31^__builtin_clz(n);
for (int j=1;j<=lg;j++)
for (int i=1;i+(1<<j)-1<=n;i++)
st[j][i]=max(st[j-1][i],st[j-1][i+(1<<j-1)]);
for (int i=1;i<=q;i++){
int ql=read(),qr=read(),qk=read();
if (qk==1) {ans[i]=queryst(ql,qr);continue;}
ql+=qk-1;qr+=1-qk;vec.push_back({1,-qk,qr,-ql,i});
}
sort(vec.begin(),vec.end(),[&](const info &x,const info &y)
{return x.a==y.a?x.op<y.op:x.a<y.a;});
vector<int>lsh;for (auto [op,a,b,c,v]:vec) lsh.emplace_back(c);
sort(lsh.begin(),lsh.end());lsh.erase(unique(lsh.begin(),lsh.end()),lsh.end());
num=lsh.size();for (auto &[op,a,b,c,v]:vec) c=lower_bound(lsh.begin(),lsh.end(),c)-lsh.begin()+1;
if (!vec.empty()) solve(0,(int)vec.size()-1);
for (int i=1;i<=q;i++)
printf("%d\n",ans[i]);
return 0;
}