#include<bits/stdc++.h>
using namespace std;const int N=2e5+5,M=2e7+5;
inline int read(){int res=0,flag=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
while(c>='0'&&c<='9'){res=(res<<3)+(res<<1)+c-'0';c=getchar();}return res*flag;}
int f[N][17],dep[N],n,m;vector<int>e[N];int nn=1e5+1;int num;
inline void add(int u,int v){e[u].push_back(v);}
void dfs0(int u,int fa){
dep[u]=dep[f[u][0]=fa]+1;
for(int i=1;i<=16;++i)f[u][i]=f[f[u][i-1]][i-1];
for(int i=e[u].size()-1;i>=0;--i)if(e[u][i]!=fa)dfs0(e[u][i],u);
}inline int LCA(int u,int v){if(dep[u]<dep[v])swap(u,v);
for(int i=16;i>=0;--i)if(dep[f[u][i]]>=dep[v])u=f[u][i];if(u==v)return u;
for(int i=16;i>=0;--i)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];return f[u][0];}
struct data{int X,Y;};
inline bool operator>(const data p,const data q){return (p.X!=q.X)?(p.X>q.X):(p.Y<q.Y);}
inline data operator+(const data p,const data q){return (p>q)?p:q;}
namespace SEG{data t[M];int ct,ls[M],rs[M];
#define mid (l+r>>1)
void update(int &rt,int l,int r,int pos,int val){if(!rt)rt=++ct;
if(l==r){t[rt]=(data){t[rt].X+val,l};return ;}
if(pos<=mid)update(ls[rt],l,mid,pos,val);
else update(rs[rt],mid+1,r,pos,val);t[rt]=t[ls[rt]]+t[rs[rt]];
}
int merge(int rt1,int rt2,int l,int r){
if(!rt1||!rt2)return rt1|rt2;
if(l==r){t[rt1].X=t[rt1].X+t[rt2].X;return rt1;}
ls[rt1]=merge(ls[rt1],ls[rt2],l,mid);rs[rt1]=merge(rs[rt1],rs[rt2],mid+1,r);
t[rt1]=t[ls[rt1]]+t[rs[rt1]];return rt1;
}
}
vector<int>col[N],va[N];int ans[N];
void dfs(int u){
for(int i=e[u].size()-1;i>=0;--i){int v=e[u][i];if(v!=f[u][0])dfs(v),SEG::merge(u,v,1,nn);}
ans[u]=(SEG::t[u].X==0)?0:SEG::t[u].Y;
}
signed main(){
//freopen("sb.in","r",stdin);freopen("sb.out","w",stdout);
SEG::ct=n=read(),m=read();
for(int i=1;i<n;++i){int u=read(),v=read();add(u,v);add(v,u);}dfs0(1,0);
for(int i=1;i<=m;++i){int u=read(),v=read(),w=read(),lca=LCA(u,v);
SEG::update(u,1,nn,w,1);SEG::update(v,1,nn,w,1);
SEG::update(lca,1,nn,w,-1);SEG::update(f[lca][0],1,nn,w,-1);
}
//for(int i=1;i<=SEG::ct;++i)cerr<<i<<" "<<SEG::t[i].X<<" "<<SEG::t[i].Y<<" "<<SEG::ls[i]<<" "<<SEG::rs[i]<<endl;
dfs(1);for(int i=1;i<=n;++i)printf("%d\n",ans[i]);return 0;
}
倒数第二个点蜜汁RE(开大空间救不了,我本机上跑进行dfs0时跑到深度为25900的点就会炸,但洛谷评测时如果我在dfs0完之后直接return 0就不会RE)
求大佬指点