#include <bits/stdc++.h>
#pragma optimization_level 3
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
using namespace std;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
int a, k, need;
vector<unordered_set<int>> l;
vector<int> us, mn, st;
int main() {
  cin.tie(0);
  cout.tie(0);
  cin.sync_with_stdio(0);
  cout.sync_with_stdio(0);
  ;
  cin >> a >> k;
  need = (a + k + 1) / 2;
  st = vector<int>(a);
  mn = vector<int>(a);
  us = vector<int>(a);
  l = vector<unordered_set<int>>(a, unordered_set<int>());
  for (int q = 0; q < k; q++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    l[x].insert(y);
    l[y].insert(x);
  }
  for (int q = 0; q < a; q++) st[q] = l[q].size();
  for (int q = 0; q < a; q++) mn[q] = (st[q] + 1) / 2;
  vector<int> perm(a);
  for (int q = 0; q < a; q++) perm[q] = q;
  shuffle(perm.begin(), perm.end(), rnd);
  for (int q = 0; q < a; q++) assert(mn[q] <= l[q].size());
  for (int w = 0; w < a && k > need; w++) {
    int v = perm[w];
    if (l[v].size() == mn[v]) continue;
    assert(mn[v] < l[v].size());
    vector<int> rem;
    for (int h : l[v]) {
      if (l[h].size() == mn[h] || l[v].size() - rem.size() == mn[v]) continue;
      rem.push_back(h);
      l[h].erase(v);
      k--;
    }
    for (int h : rem) l[v].erase(h);
  }
  assert(k <= need);
  for (int q = 0; q < a; q++) assert(mn[q] <= l[q].size());
  cout << k << endl;
  for (int q = 0; q < a; q++) {
    for (int i : l[q]) {
      assert(q != i);
      cout << q + 1 << " " << i + 1 << "\n";
      l[i].erase(q);
    }
  }
}
