int edgenum; int head[MAXn + 10]; int next[MAXn + 10]; int to[MAXn + 10];
inlineintread(){ registerchar c; for (c = getchar(); (c < '0' || c>'9') && c != '-'; c = getchar()); registerbool f = c == '-'; registerint s = f ? 0 : c - '0'; for (c = getchar(); c >= '0' && c <= '9'; c = getchar())s = (s << 3) + (s << 1) + c - '0'; return f ? -s : s; }
voidfirst(){ memset(d, 0xc0c0, sizeof(d)); }
voidinsert_edge(int from, int too){ next[++edgenum] = head[from]; head[from] = edgenum;
to[edgenum] = too; }
voidput_in(){ n = read(); for (int i = 1; i <= n; i++) v[i] = read(); for (int i = 1; i < n; i++){ int to = read(); int from = read(); insert_edge(from, to); } }
intdp(int nodeid, bool have_root){ if (d[nodeid][have_root] != NEGINF) return d[nodeid][have_root]; int& ans = d[nodeid][have_root] = 0; if (!have_root) for (int i = head[nodeid]; i; i = next[i]) ans += max(dp(to[i], 0), dp(to[i], 1)); else{ ans += v[nodeid]; for (int i = head[nodeid]; i; i = next[i]) ans += dp(to[i], 0); } return ans; }
intfind_root(){ bool have_in_deg[MAXn + 10] = { 0 }; for (int i = 1; i <= edgenum; i++) have_in_deg[to[i]] = 1; for (int i = 1; i <= n; i++) if (!have_in_deg[i]) return i; }
int n, q; int d[MAXn + 10][MAXq + 10]; int to[MAXn + 10][2];//ϱê1ΪfromµÄid int edgew[MAXn + 10][2];//ϱê1ΪfromµÄid
inlineintread(){ char c; while (c = getchar(), c < '0' || c>'9'); intx(c - '0'); while (c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; return x; }
voidInit(){ memset(d, -1, sizeof(d)); }
voidinsert_edge(int nodeid1, int nodeid2, int edge_w){ if (!to[nodeid1][0]){ to[nodeid1][0] = nodeid2; edgew[nodeid1][0] = edge_w; to[nodeid1][0] = nodeid2; edgew[nodeid1][0] = edge_w; }else{ to[nodeid1][1] = nodeid2; edgew[nodeid1][1] = edge_w; } }
intdp(int nodeid, int keepnum){ if (d[nodeid][keepnum] != -1) return d[nodeid][keepnum]; int& ans = d[nodeid][keepnum] = 0; if (!keepnum) return ans = 0; if (!to[nodeid][0]) return ans = -INF; for (int knuml = 0; knuml <= keepnum; knuml++){ int knumr = keepnum - knuml; int tmp_ans = 0; if (knuml) tmp_ans += edgew[nodeid][0] + dp(to[nodeid][0], knuml - 1); if (knumr) tmp_ans += edgew[nodeid][1] + dp(to[nodeid][1], knumr - 1); ans = max(ans, tmp_ans); } return ans; }
intmain(){ Init(); n = read(); q = read(); for (int i = 1; i < n; i++){ int nodeid1 = read(); int nodeid2 = read(); int edgew = read(); insert_edge(nodeid1, nodeid2, edgew); } cout << dp(1, q); }