这辈子没有遇见过这么离谱的事情
#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
#include<cmath>
#include<ctime>
#include<bitset>
#include<deque>
#include<queue>
#include<functional>
#include<limits>
#include<sstream>
#include<string>
#include<cstring>
#include<utility>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>//用tree
#include<ext/pb_ds/hash_policy.hpp>//用hash
#include<ext/pb_ds/trie_policy.hpp>//用trie
#include<ext/pb_ds/priority_queue.hpp>//用priority_queue
#define LL long long
#define db double
using namespace std;
//using namespace __gnu_pbds;
template<typename T>
T &read(T &r){
r=0;bool w=0;char ch=getchar();
while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
while(ch>='0'&&ch<='9') r=r*10+(ch^48),ch=getchar();
return r=w?-r:r;
}
const int N=1e5+10,t=25;
vector<int> g[N];
int n,m,fa[N][27],dep[N];
//LCA
void dfs1(int u,int fath){
fa[u][0]=fath;
dep[u]=dep[fath]+1;
for(int i=1;i<=t;i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for(auto v:g[u]){
if(v!=fath) dfs1(v,u);
}
}
int LCA(int x,int y){
if(dep[x]>dep[y]) swap(x,y);
for(int i=t;i>=0;i--){
if(dep[fa[y][i]]>=dep[x]) y=fa[y][i];
}
if(x==y) return x;
for(int i=t;i>=0;i--){
if(fa[x][i]!=fa[y][i]){
x=fa[x][i],y=fa[y][i];
}
}
return fa[x][0];
}
//SGT merge
int R[N],val[N<<6],mx[N<<6],ls[N<<6],rs[N<<6],node,ans[N];
void pushup(int x){
val[x]=max(val[ls[x]],val[rs[x]]);
mx[x]=val[x]==val[ls[x]]?mx[ls[x]]:mx[rs[x]];
return ;
}
void update(int l,int r,int &x,int p,int v){
if(!x) x=++node;
if(l==r){
val[x]+=v;
mx[x]=/*l*/p;
return ;
}
int mid=l+r>>1;
if(p<=mid) update(l,mid,ls[x],p,v);
else update(mid+1,r,rs[x],p,v);
pushup(x);
return ;
}
int merge(int x,int y,int l,int r){
if(!x||!y) return x|y;
if(l==r){
val[x]+=val[y];
mx[x]=l;
return x;
}
int mid=l+r>>1;
ls[x]=merge(ls[x],ls[y],l,mid),rs[x]=merge(rs[x],rs[y],mid+1,r);
pushup(x);
return x;
}
int dfs2(int u,int fath){
for(auto v:g[u]){
if(v==fath) continue;
dfs2(v,u);
R[u]=merge(R[u],R[v],1,n);
}
ans[u]=val[R[u]]?mx[R[u]]:0;
}
signed main(){
read(n),read(m);
for(int i=1;i<=n-1;i++){
int a,b;
read(a),read(b);
g[a].push_back(b),g[b].push_back(a);
}
dfs1(1,0);
/*while(true){
int x,y;
read(x),read(y);
printf("%d %d:%d\n",x,y,LCA(x,y));
}*/
for(int i=1;i<=m;i++){
int x,y,z;
read(x),read(y),read(z);
int lca=LCA(x,y);
// printf("%d and %d's lca is:%d\n",x,y,lca);
update(1,n,R[x],z,1);
update(1,n,R[y],z,1);
update(1,n,R[lca],z,-1);
if(fa[lca][0]) update(1,n,R[fa[lca][0]],z,-1);
}
dfs2(1,0);
for(int i=1;i<=n;i++){
printf("%d\n",ans[i]);
}
return 0;
}