#include <bits/stdc++.h>
using namespace std;
vector<int> v[500200], u[500200], a;
int n, m, d[500200];
int head[500200], to[500200 << 1], nxt[500200 << 1], st[500200 << 1], C, G;
int x[500200], y[500200], D, vis[500200], flag[200200];
int color[200200], E, TOT, tot[200200];
void add(int x, int y) {
  nxt[++C] = head[x];
  head[x] = C;
  to[C] = y;
  st[C] = x;
  nxt[++C] = head[y];
  head[y] = C;
  to[C] = x;
  st[C] = y;
}
int stk[500200], I[500200];
void DFS(int r) {
  int k = ++flag[r];
  for (int i = head[r]; i; i = nxt[i]) {
    head[r] = nxt[i];
    if (vis[i]) {
      if (flag[r] > k) break;
      continue;
    }
    vis[i] = vis[i ^ 1] = 1;
    int j = to[i];
    DFS(j);
    x[D] = st[i];
    y[D++] = to[i];
  }
}
void dfs(int r) {
  flag[r] = 1;
  color[r] = E;
  v[E].push_back(r);
  for (int i = head[r]; i; i = nxt[i]) {
    TOT++;
    if (!flag[to[i]]) dfs(to[i]);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  C = 1;
  for (int i = 0, x, y; i < m; i++) {
    scanf("%d%d", &x, &y);
    add(x, y);
    d[x]++;
    d[y]++;
  }
  for (int i = 1; i <= n; i++) {
    E++;
    TOT = 0;
    if (!flag[i]) dfs(i);
    TOT /= 2;
    for (int j = 0; j < v[E].size(); j++)
      if (d[v[E][j]] & 1) u[E].push_back(v[E][j]);
    if (u[E].size() == 0) {
      if (TOT & 1) add(v[E][0], v[E][0]);
    } else
      a.push_back(E);
    tot[E] = TOT;
  }
  if (a.size() > 0) {
    int j;
    TOT = 0;
    for (int i = 0; i < a.size(); i++) {
      int k = a[i];
      TOT += tot[k];
      for (j = 2; j < u[k].size(); j += 2) add(u[k][j], u[k][j + 1]), TOT++;
      if (i) add(u[a[i - 1]][1], u[k][0]), TOT++;
    }
    j = a.size() - 1;
    add(u[a[0]][0], u[a[j]][1]), TOT++;
    if (TOT & 1) add(u[a[0]][0], u[a[0]][0]);
  }
  for (int i = 1; i <= n; i++) flag[i] = 0;
  for (int i = 1; i <= n; i++)
    if (!flag[i]) DFS(i);
  printf("%d\n", D);
  for (int i = 0; i < D; i++) {
    if (i & 1)
      printf("%d %d\n", x[i], y[i]);
    else
      printf("%d %d\n", y[i], x[i]);
  }
  return 0;
}
