```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,l,ans[1000010];
vector<int>a[1000010];
struct Edge{
int To,Next;
}e[1000010];
int head[1000010],tot;
int cnt;
struct Node{
int top,f,seg,sum,d;
int hs;
}inf[1000010];
struct Linetree{
int sum,ans;
}lt[10000010];
/* ----------------treechain--------------- */
void add(int x,int y){
e[++tot].Next=head[x];
e[tot].To=y;
head[x]=tot;
return;
}
void dfs1(int t,int f,int dep){
inf[t].f=f;inf[t].sum=1;inf[t].d=dep;
int now=0;
for(int i=head[t];i;i=e[i].Next){
if(e[i].To!=f){
dfs1(e[i].To,t,dep+1);
inf[t].sum+=inf[e[i].To].sum;
if(inf[e[i].To].sum>now){
now=inf[e[i].To].sum;
inf[t].hs=e[i].To;
}
}
}
return;
}
void dfs2(int t,int f,int top){
inf[t].seg=++cnt;inf[t].top=top;
for(int i=head[t];i;i=e[i].Next)
if(e[i].To==inf[t].hs) dfs2(e[i].To,t,top);
for(int i=head[t];i;i=e[i].Next)
if(e[i].To!=f&&e[i].To!=inf[t].hs)
dfs2(e[i].To,t,e[i].To);
return;
}
void LCA(int x,int y,int z){
// cout<<x<<" "<<y<<" "<<z<<endl;
int nowx=inf[x].top;
int nowy=inf[y].top;
if(nowx==nowy){
if(inf[y].seg<inf[x].seg) swap(x,y);
a[inf[x].seg-1].push_back(-z);
a[inf[y].seg].push_back(z);
}
else if(inf[nowx].d>inf[nowy].d){
a[inf[nowx].seg-1].push_back(-z);
a[inf[x].seg].push_back(z);
LCA(inf[nowx].f,y,z);
}
else if(inf[nowx].d<=inf[nowy].d){
a[inf[nowy-1].seg].push_back(-z);
a[inf[y].seg].push_back(z);
LCA(x,inf[nowy].f,z);
}
return;
}
/* ------------linetree-------------- */
void build(int k,int l,int r){
lt[k].sum=0;
if(l==r){
lt[k].ans=l;
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
return;
}
void ltadd(int k,int l,int r,int x,int s){
if(l>x||r<x) return;
if(l==r&&l==x){
lt[k].sum+=s;
return;
}
int mid=l+r>>1;
ltadd(k<<1,l,mid,x,s);
ltadd(k<<1|1,mid+1,r,x,s);
if(lt[k<<1|1].sum>lt[k<<1].sum){
lt[k].sum=lt[k<<1|1].sum;
lt[k].ans=lt[k<<1|1].ans;
}
else{
lt[k].sum=lt[k<<1].sum;
lt[k].ans=lt[k<<1].ans;
}
// cout<<k<<" "<<l<<" "<<r<<" "<<lt[k].sum<<" "<<lt[k].ans<<endl;
return;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<n;i++){
int u,v;
scanf("%d %d",&u,&v);
add(u,v);
add(v,u);
}
dfs1(1,0,1);
dfs2(1,0,1);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
LCA(x,y,z);
l=max(l,z);
}
build(1,0,l);
map<int,int>h;
for(int i=1;i<=n;i++)
h[inf[i].seg]=i;
for(int i=n;i>=1;i--){
// cout<<h[i]<<endl;
for(auto j:a[i]){
int s=1;
if(j<0) s=-1;
j=abs(j);
// cout<<j<<" "<<s<<endl;
ltadd(1,0,l,j,s);
}
// system("pause");
ans[i]=lt[1].ans;
}
// system("pause");
for(int i=1;i<=n;i++){
printf("%d\n",ans[inf[i].seg]);
}
return 0;
}
```
by jqsh @ 2023-10-18 15:56:28