#include <bits/stdc++.h>
using namespace std;
char nchar() {
  static const int bufl = 1 << 20;
  static char buf[bufl], *a = NULL, *b = NULL;
  return a == b && (b = (a = buf) + fread(buf, 1, bufl, stdin), a == b) ? EOF
                                                                        : *a++;
}
inline int read() {
  int x = 0, f = 1;
  char c = nchar();
  for (; !isdigit(c); c = nchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = nchar()) x = x * 10 + c - '0';
  return x * f;
}
const int maxn = 2e6 + 10;
const int maxm = 2e6 + 10;
int n, m;
namespace graph {
struct edge {
  int u, v;
  bool alr;
  inline int oth(int x) { return u + v - x; }
} e[maxm];
int tot = 0, d[maxn];
bool vis[maxn], del[maxm];
list<int> g[maxn], ans;
int eul[maxm], len, id[maxm];
void add(int x, int y) {
  e[++tot] = (edge){x, y, false};
  g[x].push_back(tot);
  g[y].push_back(tot);
  ++d[x], ++d[y];
}
void pre(int x) {
  vis[x] = true;
  if (d[x] & 1) add(x, 0);
  for (int k : g[x]) {
    int v = e[k].oth(x);
    if (v && !vis[v]) pre(v);
  }
}
void dfs(int x, int in = 0) {
  while (true) {
    int k;
    while (!g[x].empty()) {
      k = *g[x].begin();
      if (e[k].alr)
        g[x].pop_front();
      else
        break;
    }
    if (g[x].empty()) {
      if (in) eul[++len] = in;
      break;
    }
    e[k].alr = true;
    g[x].pop_front();
    dfs(e[k].oth(x), k);
  }
}
void work(int x) {
  len = 0;
  tot = m, g[0].clear(), d[0] = 0;
  pre(x);
  dfs(x);
  id[0] = len, id[len + 1] = 1;
  for (int i = 1; i <= len; ++i) id[i] = i, del[i] = false;
  for (int i = 1; i <= len; ++i)
    if ((i & 1) == 0) {
      del[i] = true;
      if (eul[i] > m) continue;
      for (int j : {-1, 1}) {
        int y = id[i + j];
        if (eul[y] > m) {
          del[y] = true;
          del[i] = false;
          break;
        }
      }
    }
  for (int i = 1; i <= len; ++i)
    if (!del[i] && eul[i] <= m) ans.push_back(eul[i]);
}
void work() {
  ans.clear();
  for (int i = 1; i <= n; ++i)
    if (!vis[i]) {
      work(i);
    }
  printf("%u\n", ans.size());
  for (int k : ans) printf("%d %d\n", e[k].u, e[k].v);
}
}  // namespace graph
int main() {
  n = read(), m = read();
  for (int i = 1; i <= m; ++i) {
    int u = read(), v = read();
    graph::add(u, v);
  }
  graph::work();
  return 0;
}
