#include #include #include #include #include #include #include #include #include using namespace std; int main() { int N, M; cin >> N >> M; // v contains the initial balances for each person. vector v(N,0), w; for(int i = 0; i < M; i++) { int a, b, p; cin >> a >> b >> p; v[a] -= p; v[b] += p; } // The vector zero_sets contains all bitmasks for groups whose total balance is 0. vector zero_sets; for(int i = 0; i < (1 << v.size()); i++) { int sum = 0; for(int j = 0; j < (int)v.size(); j++) { if(i & (1 << j)) { sum += v[j]; } } if(sum == 0) zero_sets.push_back(i); } // For each element of zero_sets, find the largest number of groups with // zero balance it can be split into. int S = zero_sets.size(); vector groups(S,0); for(int i = 0; i < S; i++) { for(int j = 0; j < i; j++) { if(!(zero_sets[j] & ~zero_sets[i])) { // If j is a submask of i... groups[i] = max(groups[i], groups[j] + 1); } } } // Finally, correct for the pairs and singles we found at the beginning. cout << N - groups[S - 1] << endl; return 0; }