rt
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1e5+5,maxlog=21,maxt=1e7+5;
vector<int>G[maxn];
//LCA
int st[maxlog][maxn],pos[maxn],dfcnt=0;
int dep[maxn],pa[maxn];
int lg[maxn];
void dfs(int u,int fa){
pa[u]=fa;
st[0][pos[u]=++dfcnt]=fa;
dep[u]=dep[fa]+1;
for(int v:G[u]){
if(v!=fa)dfs(v,u);
}
}
int getmin(int u,int v){
return dep[u]<dep[v]?u:v;
}
void init(){
for(int i=2;i<maxn;i++)lg[i]=lg[i/2]+1;
for(int j=1;j<maxlog;j++)
for(int i=1;i+(1<<j)-1<maxn;i++)
st[j][i]=getmin(st[j-1][i],st[j-1][i+(1<<j-1)]);
}
int lca(int u,int v){
if(u==v)return u;
if((u=pos[u])>(v=pos[v]))swap(u,v);
int L=lg[v-u];
return getmin(st[L][u+1],st[L][v-(1<<L)+1]);
}
//Segment_tree
int val[maxt],lc[maxt],rc[maxt],kd[maxt],cnt=0;
void push_up(int rt){
if(val[lc[rt]]>=val[rc[rt]]){
kd[rt]=kd[lc[rt]];
val[rt]=val[lc[rt]];
}else{
kd[rt]=kd[rc[rt]];
val[rt]=val[rc[rt]];
}
}
void insert(int x,int k,int &rt,int l=1,int r=maxn){
if(!rt)rt=++cnt;
if(l==r){
val[rt]+=k;
kd[rt]=x;
}
else{
int mid=(l+r)/2;
if(x<=mid)insert(x,k,lc[rt],l,mid);
else insert(x,k,rc[rt],mid+1,r);
push_up(rt);
}
}
void merge(int &u,int v,int l=1,int r=maxn){
if(!u||!v)u=u+v;
else if(l==r){
val[u]+=val[v];
}
else {
int mid=(l+r)/2;
merge(lc[u],lc[v],l,mid);
merge(rc[u],rc[v],mid+1,r);
push_up(u);
}
}
int tree[maxn];
int n,m;
void dfs2(int u){
for(int v:G[u]){
if(v==pa[u])continue;
dfs2(v);
merge(tree[u],tree[v]);
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
init();
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
int fa=lca(a,b);
insert(c,1,tree[a]);insert(c,1,tree[b]);
insert(c,-1,tree[fa]);insert(c,-1,tree[pa[fa]]);
}
dfs2(1);
for(int i=1;i<=n;i++){
if(val[tree[i]]!=0)cout<<kd[tree[i]]<<endl;
else cout<<0<<endl;
}
return 0;
}