#include using i64 = long long; template struct MaxFlow { struct _Edge { int to; T cap; _Edge(int to, T cap) : to(to), cap(cap) {} }; int n; std::vector<_Edge> e; std::vector> g; std::vector cur, h; MaxFlow() {} MaxFlow(int n) { init(n); } void init(int n) { this->n = n; e.clear(); g.assign(n, {}); cur.resize(n); h.resize(n); } bool bfs(int s, int t) { h.assign(n, -1); std::queue que; h[s] = 0; que.push(s); while (!que.empty()) { const int u = que.front(); que.pop(); for (int i : g[u]) { auto [v, c] = e[i]; if (c > 0 && h[v] == -1) { h[v] = h[u] + 1; if (v == t) { return true; } que.push(v); } } } return false; } T dfs(int u, int t, T f) { if (u == t) { return f; } auto r = f; for (int &i = cur[u]; i < int(g[u].size()); ++i) { const int j = g[u][i]; auto [v, c] = e[j]; if (c > 0 && h[v] == h[u] + 1) { auto a = dfs(v, t, std::min(r, c)); e[j].cap -= a; e[j ^ 1].cap += a; r -= a; if (r == 0) { return f; } } } return f - r; } void addEdge(int u, int v, T c) { g[u].push_back(e.size()); e.emplace_back(v, c); g[v].push_back(e.size()); e.emplace_back(u, 0); } T flow(int s, int t) { T ans = 0; while (bfs(s, t)) { cur.assign(n, 0); ans += dfs(s, t, std::numeric_limits::max()); } return ans; } std::vector minCut() { std::vector c(n); for (int i = 0; i < n; i++) { c[i] = (h[i] != -1); } return c; } struct Edge { int from; int to; T cap; T flow; }; std::vector edges() { std::vector a; for (int i = 0; i < e.size(); i += 2) { Edge x; x.from = e[i + 1].to; x.to = e[i].to; x.cap = e[i].cap + e[i + 1].cap; x.flow = e[i + 1].cap; a.push_back(x); } return a; } }; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, M; std::cin >> N >> M; MaxFlow g(N * 2 + 2); std::vector deg(N); for (int i = 0; i < M; i++) { int u, v; std::cin >> u >> v; g.addEdge(u, v + N, 1); g.addEdge(v, u + N, 1); deg[u - 1]++; deg[v - 1]++; } for (int i = 1; i <= N; i++) { g.addEdge(0, i, 1); g.addEdge(i + N, 2 * N + 1, 1); } int ans = 2 * g.flow(0, 2 * N + 1) - N; if (ans == N - 2) { if (std::count(deg.begin(), deg.end(), 0)) { ans -= 2; } } std::cout << ans << "\n"; return 0; }