#include using namespace std; struct iofast_t { iofast_t() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); } } iofast; struct uns_t {} uns; template auto vec(Element init, Head arg, Args ...args) { if constexpr (sizeof...(Args) == 0) return std::vector(arg, init); else return std::vector(arg, vec(init, args...)); } template auto vec(uns_t, Head arg, Args ...args) { return vec(Element(), arg, args...); } template > T &chmin(T &l, T r, Compare &&f = less()) { return l = min(l, r, f); } template > T &chmax(T &l, T r, Compare &&f = less()) { return l = max(l, r, f); } int main() { #define int int64_t int n, k; cin >> n >> k; auto g = vec>(uns, n, 0); auto e = vec>(uns, n - 1); for (int i = 0; i < n - 1; ++i) { int a, b, c; cin >> a >> b >> c; --a; --b; g[a].emplace_back(b, c); g[b].emplace_back(a, c); e[i] = { a, b, c }; } auto c = vec(uns, n); auto d = vec(false, n, n); auto dfs = [&](int v, int p, auto &&dfs) -> int { auto &ans = c[v]; ans = 0; for (auto [next, _] : g[v]) { if (next == p) continue; ans += dfs(next, v, dfs); d[v][next] = true; } ans += ans == 0; return ans; }; dfs(0, -1, dfs); for (auto &[a, b, c] : e) { if (!d[a][b]) { swap(a, b); } } auto value = vec(uns, n - 1); auto weight = vec(uns, n - 1); for (int i = 0; i < n - 1; ++i) { auto [a, b, cost] = e[i]; value[i] = cost * c[b]; weight[i] = cost; } auto dp = vec(0, n, k + 1); auto prev = vec>(uns, n, k + 1); for (int i = 1; i <= n - 1; ++i) { for (int j = 0; j <= k; ++j) { if (weight[i - 1] <= j) { if (auto v = dp[i - 1][j - weight[i - 1]] + value[i - 1]; dp[i][j] < v) { dp[i][j] = v; prev[i][j] = { i - 1, j - weight[i - 1] }; } } if (dp[i][j] < dp[i - 1][j]) { dp[i][j] = dp[i - 1][j]; prev[i][j] = { i - 1, j }; } } } auto choosed = vec>(uns, 0); auto back = [&](int i, int j, auto &&back) -> void { if (i == 0 && j == 0) return; auto [pi, pj] = prev[i][j]; back(pi, pj, back); if (j != pj && weight[i - 1] <= j) { auto [a, b, c] = e[i - 1]; choosed.emplace_back(a, b); } }; back(n - 1, k, back); for (auto [a, b] : choosed) { for (auto &[c, d, cost] : e) { if (a == c && b == d) { cost *= 2; } } } int64_t ans = 0; for (auto [a, b, cost] : e) { ans += c[b] * cost; } cout << ans << endl; }