class Solution {
public:
/*
* @param edges: a directed graph where each edge is represented by a tuple
* @return: the number of edges
*/
int dfs(vector<int> &debt, int cur, int count) {
const int N = debt.size();
while (cur < N && debt[cur] == 0) ++cur;
if (cur == N) return count;
int res = N;
for (int i = cur + 1; i < N; ++i) {
if ((i > cur + 1 && debt[i] == debt[i - 1]) || (debt[i] * debt[cur] > 0)) continue;
debt[i] += debt[cur];
res = min(res, dfs(debt, cur + 1, count + 1));
debt[i] -= debt[cur];
}
return res;
}
int balanceGraph(vector<vector<int>> &edges) {
unordered_map<int, int> m;
for (const auto &e : edges) {
m[e[0]] -= e[2];
m[e[1]] += e[2];
}
vector<int> debt;
for (const auto &p : m) {
if (p.second != 0) debt.push_back(p.second);
}
sort(debt.begin(), debt.end());
return dfs(debt, 0, 0);
}
};