#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6, maxm = 1e6;
unsigned int degree[maxn + 10], blk[maxn + 10];
namespace find {
unsigned int fa[maxn + 10], siz[maxn + 10];
inline void Init(const unsigned int n) {
  iota(fa, fa + n + 1, 0);
  fill(siz, siz + n + 1, 1);
}
unsigned int GetFather(const unsigned int x) {
  return fa[x] == x ? x : fa[x] = GetFather(fa[x]);
}
inline void Merge(const unsigned int x, const unsigned int y) {
  unsigned int fx = GetFather(x), fy = GetFather(y);
  if (fx == fy) return;
  if (siz[fx] < siz[fy]) swap(fx, fy);
  fa[fy] = fx;
  siz[fx] += siz[fy];
}
}  // namespace find
int main() {
  ios_base::sync_with_stdio(false);
  unsigned int n, m;
  cin >> n >> m;
  find::Init(n);
  for (unsigned int i = 0; i < m; ++i) {
    unsigned int a, b;
    cin >> a >> b;
    find::Merge(a, b);
    ++degree[a];
    ++degree[b];
  }
  unsigned long long ans = 0;
  const unsigned int r = find::GetFather(1);
  bool fl = true;
  for (unsigned int i = 1; i <= n; ++i) {
    if (degree[i] & 0x01) ++blk[find::GetFather(i)];
    if (degree[i] && find::GetFather(i) != r) fl = false;
  }
  if (fl && !blk[r]) {
    cout << "0" << endl;
    return 0;
  }
  for (unsigned int i = 1; i <= n; ++i)
    if (find::GetFather(i) == i) {
      ans += blk[i] / 2;
      if (degree[i] && !blk[i]) ++ans;
    }
  if (!degree[1] && find::siz[1] == 1 && find::GetFather(1) == 1) ++ans;
  cout << ans << endl;
  return 0;
}
