#include using namespace std; using Int = long long; template inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template inline void chmax(T1 &a,T2 b){if(a T; vector> G; LCA(int n): n(n),T(sz,0),G(n){ memset(P,-1,sizeof(P)); memset(A,-1,sizeof(A)); memset(dat,-1,sizeof(dat)); } void add_edge(int u,int v){ G[u].emplace_back(v); G[v].emplace_back(u); } void dfs(int v,int p,int d){ int k=0,u; vector iter(n,0); using T = tuple; stack st; START: F[v]=d; D[v]=k; A[k]=P[v]=p; E[k++]=d; for(;iter[v]<(int)G[v].size();iter[v]++){ u=G[v][iter[v]]; if(u==p) continue; st.emplace(v,p,d); p=v;v=u;d=d+1; goto START; END: tie(v,p,d)=st.top();st.pop(); } A[k]=P[v]; E[k++]=d-1; if(!st.empty()) goto END; } // if it need leftmost, then add: if(E[i]==E[j]) return i>i)&1) e++; else e--; if(e(m,-1)); // ht.assign(m+1,0); for(int j=2;j<=m;j++) ht[j]=ht[j>>1]+1; for(int j=0;j>y)|(ms<<(lg-y)))&ms; return l+T[b]; } inline int ls(int i,int l){ int k=l-i*lg; int b=((B[i]>>k)|(ms<<(lg-k)))&ms; return l+T[b]; } inline int rs(int j,int r){ int k=r-j*lg+1; int b=(B[j]|(ms<D[r]) swap(l,r); int x=D[l],y=D[r]; int m=rmq(x,y); return m==x?l:A[m]; } inline int distance(int u,int v){ return F[u]+F[v]-F[lca(u,v)]*2; } }; //INSERT ABOVE HERE int xs[MAX],ys[MAX],zs[MAX]; signed main(){ int n,q; cin>>n>>q; LCA G(n); for(int i=1;i>a>>b; a--;b--; G.add_edge(a,b); } G.build(0); for(int i=0;i>xs[i]>>ys[i]>>zs[i],xs[i]--; for(int i=0;i