#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){
int x=0,t=0;
char c=getchar();
while(c<'0'||c>'9') t|=c=='-',c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return t?-x:x;
}
inline void putc(char c){
putchar(c);
}
inline void write(int x){
if(x<0) putc('-'),x=-x;
if(x>9) write(x/10);
putc('0'+x%10);
}
inline char getc(){
char c=getchar();
while(c<'0'||c>'1') c=getchar();
return c;
}
#define pii pair<int,int>
#define mpr make_pair
#define fir first
#define sec second
const int N=5e5+10,M=(1<<20)+10,V=1e7+10;
int n,q,L[N],R[N],K[N],ans[N],dep[N],head[N],cnt,p[N];
struct Edge{
int to,nxt;
}a[N<<1];
inline void add(int u,int v){
a[++cnt]={v,head[u]},head[u]=cnt;
}
struct Rng{
int l,r,d,len;
}nd[V];
int c;
set<pii>s[N];
inline void merge(int x,int t,int d){
if(s[x].size()<s[t].size()) swap(s[x],s[t]);
for(auto tp:s[t]){
auto itr=s[x].lower_bound(tp),itl=itr;
int L=tp.fir,R=tp.sec,tl=0,tr=0;
if(itr!=s[x].end()&&itr->fir==R+1) R=itr->sec,tr=1;
if(itl!=s[x].begin()&&(--itl)->sec==L-1) L=itl->fir,tl=1;
if(tl) s[x].erase(itl);
if(tr) s[x].erase(itr);
s[x].insert(mpr(L,R));
if(tl||tr) nd[++c]={L,R,d,R-L+1};
}
s[t].clear();
}
inline void dfs(int x,int fa){
dep[x]=dep[fa]+1,s[x].insert(mpr(x,x));
nd[++c]={x,x,dep[x],1};
for(int i=head[x];i;i=a[i].nxt){
int t=a[i].to;
if(t==fa) continue;
dfs(t,x);
merge(x,t,dep[x]);
}
}
struct ST_Table{
int st[19][N],lc[19][N],dfn[N],tim;
inline void dfs(int x,int fa){
st[0][dfn[x]=++tim]=fa;
for(int i=head[x];i;i=a[i].nxt){
int t=a[i].to;
if(t==fa) continue;
dfs(t,x);
}
}
inline int cmp(int x,int y){
return dep[x]<dep[y]?x:y;
}
inline int LCA(int x,int y){
if(x==y) return x;
x=dfn[x],y=dfn[y];
if(x>y) swap(x,y);
x++;
int t=__lg(y-x+1);
return cmp(st[t][x],st[t][y-(1<<t)+1]);
}
inline int LCAT(int l,int r){
if(l==r) return l;
r--;
int t=__lg(r-l+1);
return LCA(lc[t][l],lc[t][r-(1<<t)+1]);
}
inline void init(){
dfs(1,1);
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j+(1<<i)-1<=n;j++)
st[i][j]=cmp(st[i-1][j],st[i-1][j+(1<<i-1)]);
for(int i=1;i<n;i++)
lc[0][i]=LCA(i,i+1);
for(int i=1;(1<<i)<n;i++)
for(int j=1;j+(1<<i)-1<n;j++)
lc[i][j]=LCA(lc[i-1][j],lc[i-1][j+(1<<i-1)]);
}
}st;
inline bool cmp1(Rng a,Rng b){
return a.len>b.len;
}
inline bool cmp2(int i,int j){
return K[i]>K[j];
}
struct Segment_Tree{
#define ls (rt<<1)
#define rs (rt<<1|1)
int mx[M],m,id;
inline void pushup(int rt){
mx[rt]=max(mx[ls],mx[rs]);
}
inline void build(int n){
for(m=1;m<=n;m<<=1);
}
inline void modify(int p,int v){
p+=m,mx[p]=max(mx[p],v);
for(p>>=1;p;p>>=1) pushup(p);
}
inline int query(int l,int r){
int ans=0;
for(l+=m-1,r+=m+1;l^r^1;l>>=1,r>>=1){
if(~l&1) ans=max(ans,mx[l^1]);
if(r&1) ans=max(ans,mx[r^1]);
}
return ans;
}
}T1,T2;
int main(){
freopen("query.in","r",stdin);
freopen("query.out","w",stdout);
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v),add(v,u);
}
dfs(1,1),st.init();
q=read();
for(int i=1;i<=q;i++)
L[i]=read(),R[i]=read(),K[i]=read(),p[i]=i,ans[i]=dep[st.LCAT(L[i],R[i])];
bool fl=0;
for(int i=1;i<=q;i++) fl|=K[i]<R[i]-L[i]+1;
if(!fl){
for(int i=1;i<=q;i++)
write(ans[i]),putc('\n');
return 0;
}
sort(nd+1,nd+c+1,cmp1),sort(p+1,p+q+1,cmp2);
T1.build(n),T2.build(n);
for(int i=1,j=0;i<=q;i++){
while(j+1<=c&&nd[j+1].len>=K[p[i]]){
j++;
T1.modify(nd[j].l,nd[j].d);
T2.modify(nd[j].r,nd[j].d);
}
int id=p[i];
ans[id]=max({ans[id],T1.query(L[id],R[id]-K[id]+1),T2.query(L[id]+K[id]-1,R[id])});
}
for(int i=1;i<=q;i++)
write(ans[i]),putc('\n');
}