#include #define R 411 #define C 611 double t[R][C]; int basis[C]; int main() { int n, m; scanf("%d%d", &n, &m); // fill up table for (int i = 0; i < n; i++) { t[0][i] = -1; } for (int i = 1; i <= m; i++) { int a, b; scanf("%d%d", &a, &b); a--, b--; t[i][a] = t[i][b] = t[i][n + i - 1] = 1; t[i][n + m] = 1; basis[n + i - 1] = i; } while (true) { int J = -1; for (int j = 0; j < n + m; j++) { if (!basis[j] && t[0][j] < 0) { J = j; break; } } if (!~J) break; // pivot on J double minim = 1e111; int I = 0; for (int i = 1; i <= m; i++) { if (t[i][J] <= 0) continue; double quot = t[i][n+m] / t[i][J]; if (minim > quot) { minim = quot; I = i; } } if (I == 0) { // singleton vertex... ignore t[0][n+m] -= t[0][J]; t[0][J] = 0; continue; } // pivot on I double sc = t[I][J]; for (int j = 0; j <= n + m; j++) { t[I][j] /= sc; } for (int i = 0; i <= m; i++) { if (i == I) continue; sc = t[i][J]; for (int j = 0; j <= n + m; j++) { t[i][j] -= t[I][j] * sc; } } for (int j = 0; j < n + m; j++) { if (basis[j] == I) { basis[j] = 0; break; } } basis[J] = I; } // 2*result - n double ans = 2*t[0][n+m] - n; printf("%.0lf\n", ans); }