开 O2 全 RE,不开 AC
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 5e4 + 10;
const int inf = ~0u >> 1;
struct edge {
int v, nxt;
} e[MAXN << 1];
int head[MAXN], tot;
inline
void add(int u, int v) {
e[++tot] = { v, head[u] }, head[u] = tot;
}
int fa[MAXN], dep[MAXN], size[MAXN], son[MAXN];
int top[MAXN], id[MAXN], cnt;
void dfs1(int u, int f) {
fa[u] = f, dep[u] = dep[f] + 1, size[u] = 1;
for (int i = head[u], v; i; i = e[i].nxt) {
v = e[i].v;
if (v == f) continue;
dfs1(v, u), size[u] += size[v];
if (size[son[u]] < size[v]) son[u] = v;
}
}
void dfs2(int u, int t) {
top[u] = t, id[u] = ++cnt;
if (son[u]) dfs2(son[u], t);
for (int i = head[u]; i; i = e[i].nxt) {
if (e[i].v != fa[u] && e[i].v != son[u]) dfs2(e[i].v, e[i].v);
}
}
struct segtree{
int l, r, val, tag;
} t[MAXN << 2];
inline
void pushup(int p) {
t[p].val = min(t[p << 1].val, t[p << 1 | 1].val);
}
inline
void pushdown(int p) {
if (t[p].tag == inf) return ;
t[p << 1].val = min(t[p << 1].val, t[p].tag);
t[p << 1 | 1].val = min(t[p << 1 | 1].val, t[p].tag);
t[p << 1].tag = min(t[p << 1].tag, t[p].tag);
t[p << 1 | 1].tag = min(t[p << 1 | 1].tag, t[p].tag);
t[p].tag = inf;
}
void build(int l, int r, int p) {
t[p].l = l, t[p].r = r, t[p].tag = inf;
if (l == r) return t[p].val = inf, void();
int mid = l + r >> 1;
build(l, mid, p << 1), build(mid + 1, r, p << 1 | 1);
pushup(p);
}
void modify(int l, int r, int x, int p) {
if (l <= t[p].l && t[p].r <= r) return t[p].val = min(t[p].val, x), t[p].tag = min(t[p].tag, x), void();
pushdown(p);
int mid = t[p].l + t[p].r >> 1;
if (l <= mid) modify(l, r, x, p << 1);
if (r > mid) modify(l, r, x, p << 1 | 1);
pushup(p);
}
int query(int k, int p) {
if (t[p].l == t[p].r) return t[p].val;
pushdown(p);
int mid = t[p].l + t[p].r >> 1;
return query(k, p << 1 | k > mid);
}
inline
int mrange(int u, int v, int x) {
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]]) swap(u, v);
modify(id[top[u]], id[u], x, 1), u = fa[top[u]];
}
if (dep[u] > dep[v]) swap(u, v);
if (u != v) modify(id[u] + 1, id[v], x, 1);
}
int n, m, u[MAXN], v[MAXN];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i < n; i++) scanf("%d%d", &u[i], &v[i]), add(u[i], v[i]), add(v[i], u[i]);
dfs1(1, 0), dfs2(1, 1), build(1, n, 1);
for (int i = 1, x, y, k; i <= m; i++) scanf("%d%d%d", &x, &y, &k), mrange(x, y, k);
for (int i = 1, t; i < n; i++) printf("%d\n", (t = query(id[dep[u[i]] > dep[v[i]] ? u[i] : v[i]], 1)) == inf ? -1 : t);
}