#include <bits/stdc++.h>
using namespace std;
inline char gc(){
static char buf[1<<21],*p1=buf,*p2=buf;
if(p2==p1) p2=(p1=buf)+fread(buf,1,1<<20,stdin);
return *p1++;
}
inline int read(){
int x=0; char c=gc();
for(;c<'0'||c>'9';c=gc());
for(;c>='0'&&c<='9';c=gc())x=(x*10)+(c^48);
return x;
}
const int N=5e5+10;
int n;
vector<int> g[N];
int dfn[N],ord[N],fa[N],dep[N],dfcnt;
void dfs(int u,int f){
dep[u]=dep[f]+1;
dfn[u]=++dfcnt;
ord[dfcnt]=u;
fa[u]=f;
for(int v:g[u]) if(v!=f) dfs(v,u);
}
int st[21][N];
int choose(int x,int y){
return dep[x]<dep[y]?x:y;
}
void init_st(){
for(int i=1;i<=n;i++) st[0][i]=ord[i];
for(int j=1;j<=20;j++){
auto F=st[j],G=st[j-1];
for(int i=1;i<=n-(1<<j)+1;i++){
F[i]=choose(G[i],G[i+(1<<j>>1)]);
}
}
}
int qst(int l,int r){
int len=__lg(r-l+1);
return choose(st[len][l],st[len][r-(1<<len)+1]);
}
int lca(int u,int v){
if(dfn[u]>dfn[v]) swap(u,v);
int lc=qst(dfn[u],dfn[v]);
if(lc==u) return u;
else return fa[lc];
}
struct MINDEP{
int st[21][N];
void init_st(){
for(int i=1;i<=n;i++) st[0][i]=dep[i];
for(int j=1;j<=20;j++){
auto F=st[j],G=st[j-1];
for(int i=1;i<=n-(1<<j)+1;i++){
F[i]=max(G[i],G[i+(1<<j>>1)]);
}
}
}
int qst(int l,int r){
int len=__lg(r-l+1);
return max(st[len][l],st[len][r-(1<<len)+1]);
}
}mindep;
int a[N];
int lef[N],rit[N];
int stk[N],top;
struct MINDEP2{
int st[21][N];
void init_st(){
for(int i=1;i<=n;i++) st[0][i]=a[i];
for(int j=1;j<=20;j++){
auto F=st[j],G=st[j-1];
for(int i=1;i<=n-(1<<j)+1;i++){
F[i]=min(G[i],G[i+(1<<j>>1)]);
}
}
}
int qst(int l,int r){
int len=__lg(r-l+1);
return min(st[len][l],st[len][r-(1<<len)+1]);
}
}minlc;
struct BIT{
int t[N];
int h[N],hc;
void c(int x,int d){
assert(x); h[++hc]=x; for(;x<N;x+=x&-x) t[x]=max(t[x],d);
}
int q(int x){
int r=0; for(;x;x-=x&-x) r=max(r,t[x]); return r;
}
void clr(){
for(int i=1;i<=hc;i++){
for(int x=h[i];x<N;x+=x&-x) t[x]=0;
}
hc=0;
}
}T;
int ans[N];
void solve(int l,int r,vector<array<int,3>>& C,vector<array<int,4>>& Q){
if(C.empty()||Q.empty()) return ;
vector<array<int,3>> cl,cr;
vector<array<int,4>> ql,qr;
int mid=(l+r)>>1;
for(auto p:C) {
if(p[1]-p[0]+1>mid) cr.push_back(p);
else cl.push_back(p);
}
vector<array<int,4>> cur;
for(auto p:Q){
if(p[2]<=l){
cur.push_back(p);
}else if(p[2]<=mid){
ql.push_back(p);
qr.push_back(p);
}else{
qr.push_back(p);
}
}
sort(cur.begin(),cur.end(),[&](const auto& x,const auto& y){ return x[0]>y[0]; });
sort(C.begin(),C.end(),[&](const auto& x,const auto& y){ return x[0]>y[0]; });
int now=0;
T.clr();
for(auto p:C){
while(now!=cur.size()&&p[0]<cur[now][0]){
auto q=cur[now];
ans[q[3]]=max(ans[q[3]],T.q(q[1]));
now++;
}
T.c(p[1],p[2]);
}
while(now!=cur.size()){
auto q=cur[now];
ans[q[3]]=max(ans[q[3]],T.q(q[1]));
now++;
}
if(l!=r){
solve(l,mid,cl,ql);
solve(mid+1,r,cr,qr);
}
}
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(int i=1;i<n;i++){
int u,v;
u=read(); v=read();
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,1);
init_st();
mindep.init_st();
for(int i=1;i<n;i++){
a[i]=dep[lca(i,i+1)];
}
for(int i=1;i<n;i++){
while(a[stk[top]]>=a[i]) top--;
lef[i]=stk[top]+1;
stk[++top]=i;
}
top=1;
stk[top]=n;
for(int i=n-1;i>=1;i--){
while(a[stk[top]]>=a[i]) top--;
rit[i]=stk[top];
stk[++top]=i;
}
vector<array<int,3>> c1,c2;
for(int i=1;i<n;i++){
c1.push_back({lef[i],rit[i],a[i]});
c2.push_back({rit[i],lef[i],a[i]});
}
sort(c1.begin(),c1.end());
sort(c2.begin(),c2.end());
c1.resize(unique(c1.begin(),c1.end())-c1.begin());
c2.resize(unique(c2.begin(),c2.end())-c2.begin());
vector<array<int,4>> q1,q2;
minlc.init_st();
int m=read();
for(int i=1;i<=m;i++){
int l,r,k;
l=read(); r=read(); k=read();
if(k==1){
ans[i]=mindep.qst(l,r);
continue;
}
if(k==r-l+1){
ans[i]=minlc.qst(l,r-1);
}
q1.push_back({l,r,k,i});
q2.push_back({l+k-1,l,1,i});
q2.push_back({r,r-k+1,1,i});
}
solve(1,n,c1,q1);
solve(1,1,c2,q2);
for(int i=1;i<=m;i++){
printf("%d\n",ans[i]);
}
}