#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, fh = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') fh = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * fh;
}
const int maxn = 1e5 + 5, maxm = 1e6 + 5;
struct Edge {
  int to, next;
} e[maxm];
int head[maxn], tot = 1, n, m, vis[maxm], degree[maxn], ji_dian[maxn], top1,
                st1[maxm], st2[maxm], top2, cnt;
void connect(int x, int y) {
  e[++tot] = (Edge){y, head[x]};
  head[x] = tot;
}
void dfs(int now) {
  for (int &i = head[now]; i; i = e[i].next) {
    if (vis[i]) continue;
    int p = e[i].to;
    vis[i] = vis[i ^ 1] = 1;
    dfs(p);
    ++cnt;
    if (cnt & 1)
      printf("%d %d\n", now, p);
    else
      printf("%d %d\n", p, now);
  }
}
int main() {
  n = read(), m = read();
  for (register int i = 1; i <= m; ++i) {
    int u = read(), v = read();
    degree[u]++, degree[v]++;
    connect(u, v);
    connect(v, u);
  }
  for (register int i = 1; i <= n; ++i)
    if (degree[i] & 1) ji_dian[++top1] = i;
  for (int i = 1; i <= top1; i += 2)
    connect(ji_dian[i], ji_dian[i + 1]), connect(ji_dian[i + 1], ji_dian[i]),
        ++m;
  if (m & 1) ++m, connect(1, 1), connect(1, 1);
  printf("%d\n", m);
  dfs(1);
  return 0;
}
