#include using namespace std; #define FOR(i, a, b) for (int i=(a); i<(b); i++) #define FORD(i, a, b) for (int i=(a); i>(b); i--) #define ALL(w) w.begin(), w.end() #define SZ(x) ((int)(x).size()) #define pb push_back const int maxL = 19, maxN = 1 << maxL; int jp[maxL][maxN]; vector G[maxN]; int D[maxN], parent[maxN]; set S[maxN]; int lca(int a, int b) // D[a] == D[b] { if (a == b) return a; FORD(l, maxL-1, -1) if (jp[l][a] != jp[l][b]) a = jp[l][a], b = jp[l][b]; return jp[0][a]; } void disc(int v, int fat) { jp[0][v] = fat; FOR(l, 1, maxL) jp[l][v] = jp[l-1][jp[l-1][v]]; for (int u : G[v]) if (D[u] > D[v]) { D[u] = D[v] + 1; S[D[u]].insert(u); parent[u] = min(parent[u], v); } } int dist(int a, int b) { return D[a] + D[b] - D[lca(a, b)] * 2; } int main() { int n, m; scanf ("%d%d", &n, &m); while (m--) { int a, b; scanf ("%d%d", &a, &b); G[a].pb(b); G[b].pb(a); } fill(D, D+n, n); fill(parent, parent+n, n); D[0] = 0; disc(0, 0); int v = 0; long long res = 0; FOR(d, 1, n) { for (int u : S[d]) { res += dist(v, parent[u]) + 2; v = parent[u]; disc(u, parent[u]); } if (S[d].empty()) break; res--; v = *(S[d].rbegin()); } printf("%lld\n", res); return 0; }