#include <bits/stdc++.h>
using namespace std;
inline char read() {
  static const int IN_LEN = 1000000;
  static char buf[IN_LEN], *s, *t;
  return (s == t               ? t = (s = buf) + fread(buf, 1, IN_LEN, stdin),
          (s == t ? -1 : *s++) : *s++);
}
template <class T>
inline void read(T &x) {
  static bool iosig;
  static char c;
  for (iosig = false, c = read(); !isdigit(c); c = read()) {
    if (c == '-') iosig = true;
    if (c == -1) return;
  }
  for (x = 0; isdigit(c); c = read()) x = ((x + (x << 2)) << 1) + (c ^ '0');
  if (iosig) x = -x;
}
const int OUT_LEN = 10000000;
char obuf[OUT_LEN], *ooh = obuf;
inline void print(char c) {
  if (ooh == obuf + OUT_LEN) fwrite(obuf, 1, OUT_LEN, stdout), ooh = obuf;
  *ooh++ = c;
}
template <class T>
inline void print(T x) {
  static int buf[30], cnt;
  if (x == 0)
    print('0');
  else {
    if (x < 0) print('-'), x = -x;
    for (cnt = 0; x; x /= 10) buf[++cnt] = x % 10 + 48;
    while (cnt) print((char)buf[cnt--]);
  }
}
inline void flush() { fwrite(obuf, 1, ooh - obuf, stdout); }
const int N = 100005;
int n, m, num, cnt, now, top, dis, ans, f[N], bl[N], dfn[N], low[N], stk[N],
    h[N], e[N << 1], pre[N << 1];
bool vis[N];
vector<int> E[N];
inline void add(int x, int y) { e[++num] = y, pre[num] = h[x], h[x] = num; }
void tarjan(int u, int fa = 0) {
  dfn[u] = low[u] = ++cnt;
  stk[++top] = u;
  for (int i = h[u]; i; i = pre[i])
    if (e[i] != fa) {
      if (!dfn[e[i]]) {
        tarjan(e[i], u), low[u] = min(low[u], low[e[i]]);
      } else
        low[u] = min(low[u], dfn[e[i]]);
    }
  if (low[u] == dfn[u]) {
    ++now;
    do bl[stk[top]] = now;
    while (stk[top--] != u);
  }
}
void dfs(int u, int fa = 0) {
  vis[u] = 1;
  int mx2 = 0;
  ans -= (E[u].size() == 1);
  for (unsigned i = 0; i < E[u].size(); ++i)
    if (E[u][i] != fa) {
      dfs(E[u][i], u);
      if (f[E[u][i]] > f[u])
        mx2 = f[u], f[u] = f[E[u][i]];
      else if (f[E[u][i]] > mx2)
        mx2 = f[E[u][i]];
    }
  ++f[u], dis = max(dis, f[u] + mx2);
}
int main() {
  read(n), read(m);
  for (int i = 1, x = 0, y = 0; i <= m; ++i)
    read(x), read(y), add(x, y), add(y, x);
  for (int i = 1; i <= n; ++i)
    if (!dfn[i]) tarjan(i);
  for (int i = 1; i <= n; ++i)
    for (int j = h[i]; j; j = pre[j])
      if (bl[i] != bl[e[j]]) {
        E[bl[i]].push_back(bl[e[j]]);
      }
  ans = n;
  for (int i = 1; i <= now; ++i)
    if (!vis[i]) dis = 0, dfs(i), ans += -dis + (dis > 1 ? 2 : 0) + (i != 1);
  return printf("%d", ans), 0;
}
