dep【1】必须初始化
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+15;
#define pb push_back
vector<int>E[N];
int n,m;
int dep[N],f[N][25];
void dfs(int u,int fa){
for(auto v:E[u])if(v!=f[u][0]){
dep[v]=dep[u]+1;
f[v][0]=u;
dfs(v,u);
}
}
void st(){
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
}
int lca(int x,int y){
if(dep[x]<dep[y])
swap(x,y);
for(int i=log2(n);i>=0;i--){
if(dep[f[x][i]]>=dep[y])
x=f[x][i];
}
if(x==y)
return x;
for(int i=log2(n);i>=0;i--){
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
}
return f[x][0];
}
int tr[N*55],lson[N*55],rson[N*55],tot[N*55],id[N*55];
int cnt;
void pushup(int k){
if(tot[lson[k]]>=tot[rson[k]]){
id[k]=id[lson[k]];tot[k]=tot[lson[k]];
}
else{
id[k]=id[rson[k]];tot[k]=tot[rson[k]];
}
}
void insert(int &k,int l,int r,int pos,int del){
if(!k)k=++cnt;
if(l==r){
tot[k]+=del;
//cout<<tot[k]<<endl;
id[k]=l;
return;
}
int mid=l+r>>1;
if(pos<=mid)
insert(lson[k],l,mid,pos,del);
if(pos>mid)
insert(rson[k],mid+1,r,pos,del);
pushup(k);
}
void merge(int &x,int y,int l,int r){
if(!x||!y){x=x+y;return;}
if(l==r){
tot[x]+=tot[y];
id[x]=l;//因为有可能当前节点是空的,所以还是需要的
return;
}
int mid=l+r>>1;
merge(lson[x],lson[y],l,mid);
merge(rson[x],rson[y],mid+1,r);
pushup(x);
}
int query(int k,int l,int r){
if(!tot[k])
return 0;
return id[k];
}
int ans[N];
void dfs_ans(int u,int fa){
for(auto v:E[u])if(v!=f[u][0]){
dfs_ans(v,u);
merge(tr[u],tr[v],1,N);
}
ans[u]=query(tr[u],1,N);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v;cin>>u>>v;
E[u].pb(v);E[v].pb(u);
}
dep[1]=1;//这个不加wa四个点
dfs(1,0);
st();
for(int i=0;i<m;i++){
int x,y,z;cin>>x>>y>>z;
int ft=lca(x,y);
insert(tr[x],1,N,z,1);
insert(tr[y],1,N,z,1);
insert(tr[ft],1,N,z,-1);
if(f[ft][0])//+++
insert(tr[f[ft][0]],1,N,z,-1);
}
dfs_ans(1,0);
for(int i=1;i<=n;i++)
cout<<ans[i]<<'\n';
}