// O(N * S^2) #include using namespace std; void combine(vector& A, const vector& B) { int n = A.size(); for(int i=n-1;i>=0;i--) for(int j=0;i+j, vector> f(int v, int p, int S, const vector>& adj, const vector& strength, const vector& size) { vector best_used(S+1, -1), best_dont(S+1, -1); if(size[v] <= S) best_used[size[v]] = strength[v]; best_used[0] = best_dont[0] = 0; for(int u : adj[v]) { if (u == p) continue; auto [used, dont] = f(u, v, S, adj, strength, size); for(int i=0;i<=S;i++) used[i] = max(dont[i], used[i]); combine(best_dont, used); combine(best_used, dont); } return {best_used, best_dont}; } int main() { int n, S; cin >> n >> S; vector strength(n), size(n); for(int i=0;i> size[i] >> strength[i]; vector> adj(n); for(int i=0;i> u >> v; adj[u-1].push_back(v-1); adj[v-1].push_back(u-1); } auto [used, dont] = f(0, -1, S, adj, strength, size); cout << max(*max_element(used.begin(), used.end()), *max_element(dont.begin(), dont.end())) << endl; }