#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int inf = 0x3f3f3f3f;
const long long INF = 1e18;
template <typename T>
void read(T &x) {
  x = 0;
  int s = 1, c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') s = -1;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - 48;
  x *= s;
}
template <typename T>
void write(T x) {
  if (x < 0) x = -x, putchar('-');
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
template <typename T>
void writeln(T x) {
  write(x);
  puts("");
}
const int maxn = 1e6 + 5;
int n, m, ans;
int d[maxn], cnt[maxn], mark[maxn];
vector<int> adj[maxn];
vector<pair<int, int> > E;
map<pair<int, int>, int> mp;
int main() {
  read(n), read(m);
  for (int i = 0; i <= m - 1; i++) {
    int u, v;
    read(u), read(v);
    if (u > v) swap(u, v);
    adj[u].emplace_back(v);
    adj[v].emplace_back(u);
    d[u]++, d[v]++;
    E.emplace_back(u, v);
    mp[{u, v}] = i;
  }
  for (int i = 1; i <= n; i++) cnt[i] = d[i] / 2;
  function<int(int, int)> Find = [&](int u, int v) {
    if (u > v) swap(u, v);
    return mp[{u, v}];
  };
  function<void(void)> solve = [&] {
    int mod = n;
    priority_queue<pair<int, int> > Q;
    for (int i = 1; i <= n; i++) Q.emplace(cnt[i], i);
    for (int times = 1; times <= n; times++) {
      int u = Q.top().second;
      Q.pop();
      for (int v : adj[u]) {
        if (cnt[u] && cnt[v]) {
          int id = Find(u, v);
          if (mark[id]) continue;
          cnt[u]--, cnt[v]--;
          mark[id] = 1, ans--;
        }
        if (!cnt[u]) break;
      }
    }
  };
  ans = m;
  solve();
  writeln(ans);
  for (int i = 0; i < E.size(); i++) {
    if (!mark[i]) printf("%d %d\n", E[i].first, E[i].second);
  }
  return 0;
}
