#include <bits/stdc++.h>
template <typename T>
void read(T& re) {
  re = 0;
  int re2 = 1;
  char ch = '!';
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') re2 = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') re = re * 10 + ch - '0', ch = getchar();
  re *= re2;
}
template <typename T, typename... Args>
void read(T& re, Args&... args) {
  read(re);
  read(args...);
}
template <typename T>
void write_(T A) {
  if (A < 0) A = -A, putchar('-');
  if (A / 10) write_(A / 10);
  putchar(A % 10 + '0');
}
template <typename T>
void write(T A, char ch = '!') {
  write_(A);
  if (ch != '!') putchar(ch);
}
int T;
const int MAXN = 1e6 + 7, mod = 998244353;
int n, m;
struct side {
  int from, to, col, nex, lst, del;
} edge[MAXN];
int head[MAXN];
int cntm = 1;
void link(int from, int to) {
  edge[++cntm].from = from;
  edge[cntm].to = to;
  edge[cntm].col = 0;
  edge[cntm].del = 0;
  edge[cntm].nex = head[from];
  edge[head[from]].lst = cntm;
  head[from] = cntm;
}
int d[MAXN], d2[MAXN];
int cntans, cntans2;
int ans[MAXN][2], ans2[MAXN][2];
int cntsp;
int sp[MAXN];
int S;
void dfs(int now) {
  for (int i = head[now], v; i; i = edge[i].nex) {
    if (edge[i].del) {
      if (edge[i].nex) edge[edge[i].nex].lst = edge[i].lst;
      if (edge[i].lst) edge[edge[i].lst].nex = edge[i].nex;
      if (i == head[now]) head[now] = edge[i].nex;
      continue;
    }
    edge[i].del = edge[i ^ 1].del = 1;
    head[now] = edge[i].nex;
    v = edge[i].to;
    dfs(v);
    ans2[++cntans2][0] = edge[i].from;
    ans2[cntans2][1] = edge[i].to;
  }
}
int main() {
  T = 1;
  while (T--) {
    read(n, m);
    for (int i = 1, i2, i3; i <= m; i++) {
      read(i2, i3);
      link(i2, i3);
      link(i3, i2);
      d[i2]++;
      d[i3]++;
    }
    for (int i = 1; i <= n; i++)
      if (d[i] & 1) sp[++cntsp] = i;
    for (int i = 1; i <= cntsp; i += 2) {
      link(sp[i], sp[i + 1]);
      link(sp[i + 1], sp[i]);
    }
    S = 1;
    dfs(S);
    for (int i = cntans2; i >= 1; i--) {
      ans[++cntans][0] = ans2[i][0];
      ans[cntans][1] = ans2[i][1];
      if ((cntans2 - i + 1) % 2 == 0) std::swap(ans[cntans][0], ans[cntans][1]);
    }
    memset(d, 0, sizeof(d));
    memset(d2, 0, sizeof(d2));
    for (int i = 1; i <= cntans; i++) {
      d[ans[i][0]]++;
      d2[ans[i][1]]++;
    }
    for (int i = 1; i <= n; i++) {
      if (d[i] % 2 == 1 && d2[i] % 2 == 1) {
        ans[++cntans][0] = i;
        ans[cntans][1] = i;
      }
    }
    write(cntans, '\n');
    for (int i = 1; i <= cntans; i++) {
      write(ans[i][0], ' ');
      write(ans[i][1], '\n');
    }
  }
  return 0;
}
