rt,数组开小 RE,开大一点就 MLE
# include <bits/stdc++.h>
# define ll int
// # define int int
# define rint register int
# define Ls (tr[now].ls)
# define Rs (tr[now].rs)
# define mid (l + r >> 1)
int read() {int s = 0 , w = 0; char c = getchar(); while (!isdigit(c)) w |= (c == '-') , c = getchar(); while (isdigit(c)) s = (s << 1) + (s << 3) + (c ^ 48) , c = getchar(); return w ? -s : s;}
void write(int x) {if (x < 0) putchar('-') , x = ~ (x - 1); if (x > 9) write(x / 10); putchar(x % 10 | 48);}
void writesp(int x) {write(x) , putchar(' '); }
void writeln(int x) {write(x) , putchar('\n');}
using namespace std;
constexpr int N = 1e5 + 10;
constexpr int X = 1e5;
struct node {
int ls,rs;
int sum;
int kind;
};
struct ins {
int nxt, to;
};
int n, m, cnt, ccnt;
int rt[N], dep[N], fa[N][20];
int head[N * 2], ans[N];
node tr[4000005];
ins b[N];
void debug () {
cout << "qwq" << endl;
return ;
}
void add (int u, int v) {
cnt ++;
b[cnt].nxt = head[u];
b[cnt].to = v;
head[u] = cnt;
return ;
}
void pre (int now, int fat) {
// debug ();
fa[now][0] = fat;
dep[now] = dep[fat] + 1;
for (rint i = 1; i < 20; i ++)
fa[now][i] = fa[fa[now][i - 1]][i - 1];
for (rint i = head[now]; i; i = b[i].nxt) {
int v = b[i].to;
if (v == fat) continue;
pre (v, now);
}
return ;
}
int lca(int u, int v) {
// debug ();
if (dep[u] != dep[v]) {
if (dep[u] < dep[v]) swap (u, v);
for (rint i = 19; i >= 0; i --)
if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
}
if (u == v) return u;
for (rint i = 19; i >= 0; i --)
if (fa[u][i] != fa[v][i])
u = fa[u][i], v = fa[v][i];
return fa[u][0];
}
void pushup(int now) {
if (Ls == 0) {tr[now].sum = tr[Rs].sum, tr[now].kind = tr[Rs].kind; return ;}
if (Rs == 0) {tr[now].sum = tr[Ls].sum, tr[now].kind = tr[Ls].kind; return ;}
if (tr[Ls].sum >= tr[Rs].sum) {tr[now].sum = tr[Ls].sum, tr[now].kind = tr[Ls].kind;return ;}
if (tr[Ls].sum < tr[Rs].sum) {tr[now].sum = tr[Rs].sum, tr[now].kind = tr[Rs].kind;}
return ;
}
void change (int &now, int l, int r, int v, int w) {
if (now == 0) ccnt ++, now = ccnt;
if (l == r) {
tr[now].sum = tr[now].sum + w;
tr[now].kind = v;
return ;
}
if (v <= mid) change (Ls, l, mid, v, w);
else change (Rs, mid + 1, r, v, w);
pushup(now);
return ;
}
int merge (int u, int v, int l, int r) {
if (u == 0 || v == 0) return u + v;
if (l == r) {
tr[u].sum = tr[u].sum + tr[v].sum;
tr[u].kind = r;
return u;
}
tr[u].ls = merge (tr[u].ls, tr[v].ls, l, mid);
tr[u].rs = merge (tr[u].rs, tr[v].rs, mid + 1, r);
pushup (u);
return u;
}
void solve (int u, int fat) {
for (rint i = head[u]; i; i = b[i].nxt) {
int v = b[i].to;
if (v == fat) continue;
solve (v, u);
rt[u] = merge (rt[u], rt[v], 1, X);
}
if (tr[rt[u]].sum == 0) ans[u] = 0;
else ans[u] = tr[rt[u]].kind;
}
signed main() {
n = read (), m =read ();
for (rint i = 1; i < n; i ++) {
int u = read ();
int v = read ();
add (u, v);
add (v, u);
}
pre (1, 0);
while (m --) {
int k = read (), ioi = read (), kd = read ();
change (rt[k], 1, X, kd, 1);
change (rt[ioi], 1, X, kd, 1);
change (rt[lca(k, ioi)], 1, X, kd, -1);
change (rt[fa[lca(k, ioi)][0]], 1, X, kd, -1);
}
solve (1, 0);
for (rint i = 1; i <= n; i ++) writeln (ans[i]);
return 0;
}