#include using namespace std; const int N = 5007; int n, m; int dist[N]; bool vis[N]; int adj[N]; int adj2[N]; vector G[N]; bool dfs(int u){ vis[u] = true; for(auto t: G[u]){ int v = adj2[t]; if(v == 0){ adj[u] = t; adj2[t] = u; return true; } else if(dist[v] == dist[u] + 1 && !vis[v] && dfs(v)){ adj[u] = t; adj2[t] = u; return true; } } return false; } int matching(){ bool change = true; while(change){ queue Q; for(int i = 1; i <= n; ++i) if(adj[i] == 0) Q.push(i), dist[i] = 0; else dist[i] = -1; while(!Q.empty()){ int u = Q.front(); Q.pop(); for(auto t: G[u]){ int v = adj2[t]; if(v != 0 && dist[v] == -1){ Q.push(v); dist[v] = dist[u] + 1; } } } for(int i = 1; i <= n; ++i) vis[i] = false; change = false; for(int i = 1; i <= n; ++i) if(adj[i] == 0 && dfs(i)) change = true; } int ans = 0; for(int i = 1; i <= n; ++i) ans += adj[i] > 0; return ans; } int main(){ scanf("%d %d", &n, &m); for(int i = 1; i <= m; ++i){ int u, v; scanf("%d %d", &u, &v); G[u].push_back(v); } int ans = m - (2 * n - 2 - matching()); printf("%d\n", ans); return 0; }