#include <bits/stdc++.h> using namespace std;
typedef long long ll; typedef unsigned long long ull; #define INF 0x3f3f3f3f #define re register const int maxn=1e5+5; const int maxm=6e6+5;
inline int mymax(int a,int b){ return a>b?a:b; }
inline int mymin(int a,int b){ return a<b?a:b; }
int n,m,MAX,tot; int X[maxn],Y[maxn],Z[maxn],ans[maxn],root[maxn];
int L[maxm],R[maxm],dat[maxm],t[maxm];
int head[maxn],nxt[maxn<<1],to[maxn<<1],cnt;
inline void add(int u,int v){ nxt[++cnt]=head[u]; to[cnt]=v; head[u]=cnt; }
int fa[maxn],top[maxn],size[maxn],son[maxn],dep[maxn];
void dfs1(int u,int f){ size[u]=1; fa[u]=f; dep[u]=dep[f]+1; for(re int i=head[u];i;i=nxt[i]){ int v=to[i]; if(v==f)continue; dfs1(v,u); size[u]+=size[v]; if(size[v]>size[son[u]]){ son[u]=v; } } }
void dfs2(int u,int topf){ top[u]=topf; if(!son[u])return; dfs2(son[u],topf); for(re int i=head[u];i;i=nxt[i]){ int v=to[i]; if(v==topf||v==son[u]||top[v])continue; dfs2(v,v); } }
inline int lca(int u,int v){ while(top[u]!=top[v]){ if(dep[top[u]]<dep[top[v]])swap(u,v); u=fa[top[u]]; } return dep[u]<dep[v]?u:v; }
inline void push_up(int rt){ if(dat[L[rt]]>=dat[R[rt]])dat[rt]=dat[L[rt]],t[rt]=t[L[rt]]; else dat[rt]=dat[R[rt]],t[rt]=t[R[rt]]; }
int modify(int rt,int l,int r,int pos,int val){ if(!rt)rt=++tot; if(l==r){ dat[rt]+=val; t[rt]=l; return rt; } int mid=(l+r)>>1; if(pos<=mid)L[rt]=modify(L[rt],l,mid,pos,val); else R[rt]=modify(R[rt],mid+1,r,pos,val); push_up(rt); return rt; }
int merge(int p,int q,int l,int r){ if(!p||!q)return p+q; if(l==r){ dat[p]+=dat[q]; t[p]=l; return p; } int mid=(l+r)>>1; L[p]=merge(L[p],L[q],l,mid); R[p]=merge(R[p],R[q],mid+1,r); push_up(p); return p; }
void solve(int u){ for(re int i=head[u];i;i=nxt[i]){ int v=to[i]; if(dep[v]>dep[u])solve(v),root[u]=merge(root[u],root[v],1,MAX); if(dat[root[u]])ans[u]=t[root[u]]; } }
inline int read(){ int x=0, f=1;char ch=getchar(); while (!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();} while (isdigit(ch)){x=x*10+(ch^48);ch=getchar();} return x*f; }
int main() { #ifdef LawrenceSivan freopen("aa.in", "r", stdin); freopen("aa.out", "w", stdout); #endif n=read();m=read(); for(re int i=1,u,v;i<n;i++){ u=read();v=read(); add(u,v); add(v,u); } dfs1(1,0); dfs2(1,1);
for(re int i=1;i<=m;i++){ X[i]=read();Y[i]=read();Z[i]=read(); MAX=mymax(Z[i],MAX); } for(re int i=1;i<=m;i++){ int LCA=lca(X[i],Y[i]); root[X[i]]=modify(root[X[i]],1,MAX,Z[i],1); root[Y[i]]=modify(root[Y[i]],1,MAX,Z[i],1); root[LCA]=modify(root[LCA],1,MAX,Z[i],-1); if(fa[LCA])root[fa[LCA]]=modify(root[fa[LCA]],1,MAX,Z[i],-1); }
solve(1); for(re int i=1;i<=n;i++){ printf("%d\n",ans[i]); }
return 0; }
|