#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=1e5+10;
int n,m,Z,ans[N];
int f[N][20],deep[N]; //LCA
int nn,first[N],next[N*2],to[N*2]; //手写链接表
int cnt,l[N*80],r[N*80],sum[N*80],T[N]; //数组线段树
int read() //读入优化
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
void add(int x,int y) //加入邻接表
{
next[++nn]=first[x];
first[x]=nn;
to[nn]=y;
}
void pre(int x,int fa) //倍增预处理
{
deep[x]=deep[fa]+1;
for(int i=1;i<=18;++i)
f[x][i]=f[f[x][i-1]][i-1];
for(int e=first[x];e;e=next[e])
{
if(to[e]==fa) continue;
f[to[e]][0]=x;
pre(to[e],x);
}
}
int LCA(int x,int y) //倍增求LCA
{
if(deep[x]<deep[y]) swap(x,y);
for(int i=18;i>=0;--i)
{
if(deep[f[x][i]]>=deep[y]) x=f[x][i];
if(x==y) return y;
}
for(int i=18;i>=0;--i)
{
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
}
return f[x][0];
}
void pushup(int x)
{ sum[x]=sum[l[x]]+sum[r[x]]; }
void update(int &x,int L,int R,int k,int val)
{
if(!x) x=++cnt;
if(L==R)
{
sum[x]+=val;
return;
}
int mid=(L+R)>>1;
if(k<=mid) update(l[x],L,mid,k,val);
else update(r[x],mid+1,R,k,val);
pushup(x);
return;
}
int merge(int x,int y,int L,int R) //线段树合并
{
if(!x) return y;
if(!y) return x;
if(L==R)
{
sum[x]+=sum[y];
return x;
}
int mid=(L+R)>>1;
l[x]=merge(l[x],l[y],L,mid);
r[x]=merge(r[x],r[y],mid+1,R);
pushup(x);
return x;
}
struct answer //用来query存临时答案
{
int kind,num;
} aa;
void query(int x,int L,int R) //找数量最多的救济粮
{
if(!x) return;
if(L==R)
{
if(sum[x]>aa.num) aa={L,sum[x]};
return;
}
int mid=(L+R)>>1;
query(l[x],L,mid);
query(r[x],mid+1,R);
return;
}
void dfs(int x) //dfs>>从叶节点向根节点合并 并求出答案
{
for(int e=first[x];e;e=next[e])
{
if(to[e]==f[x][0]) continue;
dfs(to[e]);
T[x]=merge(T[x],T[to[e]],1,Z);
}
aa={0,0};
query(T[x],1,Z);
ans[x]=aa.kind;
}
int main()
{
freopen("P4556_3.in","r",stdin);
n=read();m=read(); Z=100000;
for(int i=1;i<=n-1;++i)
{
int x=read(),y=read();
add(x,y);
add(y,x);
}
pre(1,0);
for(int i=1;i<=m;++i)
{
int x=read(),y=read(),z=read();
int lca=LCA(x,y);
update(T[x],1,Z,z,1);
update(T[y],1,Z,z,1);
update(T[lca],1,Z,z,-1);
update(T[f[lca][0]],1,Z,z,-1);
}
dfs(1);
for(int i=1;i<=n;++i)
printf("%d\n",ans[i]);
return 0;
}
实在不知道为什么T啊这常数到1e3了???