#include #include #include using namespace std; using ll = long long; #define rep(i,n) for(int i=0; i<(n); i++) struct Edge{ int to, d; }; int N, K; vector> E; vector I; vector P; vector D; vector Z; int main(){ scanf("%d%d",&N,&K); E.resize(N); rep(i,N-1){ int u,v,d; scanf("%d%d%d",&u,&v,&d); u--; v--; E[u].push_back({v,d}); E[v].push_back({u,d}); } P.assign(N,-1); D.assign(N,0); Z.assign(N,1); queue Q; Q.push(0); while(Q.size()){ int p = Q.front(); Q.pop(); I.push_back(p); for(Edge e : E[p]) if(P[p] != e.to){ P[e.to] = p; D[e.to] = e.d; Q.push(e.to); Z[p] = 0; } } for(int i=N-1; i>=1; i--){ int p=I[i]; Z[P[p]]+=Z[p]; } ll ans = 0; rep(i,N) ans += (ll)Z[i] * D[i]; vector dp(K+1,0); rep(i,N){ vector tmp = dp; for(int k=D[i]; k<=K; k++) tmp[k] = max(tmp[k],dp[k-D[i]]+Z[i]*D[i]); dp = move(tmp); } printf("%lld\n",ans+dp[K]); return 0; }