#include <bits/stdc++.h>
using namespace std;
const int iN = 500010;
inline char get(void) {
  static char buf[100000], *p1 = buf, *p2 = buf;
  if (p1 == p2) {
    p2 = (p1 = buf) + fread(buf, 1, 100000, stdin);
    if (p1 == p2) return EOF;
  }
  return *p1++;
}
inline void read(int &x) {
  x = 0;
  static char c;
  for (; !(c >= '0' && c <= '9'); c = get())
    ;
  for (; c >= '0' && c <= '9'; x = x * 10 + c - '0', c = get())
    ;
}
int head[iN], sub;
struct Edge {
  int u, v, nxt;
  Edge(void) {}
  Edge(const int &u, const int &v, const int &nxt) : u(u), v(v), nxt(nxt) {}
} edge[iN << 1];
inline void Add(int a, int b) {
  edge[++sub] = Edge(a, b, head[a]), head[a] = sub;
}
int N, M, fa[iN], deg[iN];
inline void Init(int n) {
  for (int i = 1; i <= n; i++) fa[i] = i;
}
inline int getf(int x) { return fa[x] == x ? x : fa[x] = getf(fa[x]); }
int s[iN], t;
inline void Dfs(int u) {
  for (int i = getf(head[u]), v; i; i = getf(edge[i].nxt)) {
    v = edge[i].v;
    fa[i] = edge[i].nxt;
    fa[i ^ 1] = edge[i ^ 1].nxt;
    Dfs(v);
    s[++t] = i;
  }
}
int main(void) {
  read(N), read(M);
  sub = 1;
  for (int i = 1, u, v; i <= M; i++) {
    read(u), read(v);
    deg[u]++, deg[v]++;
    Add(u, v), Add(v, u);
  }
  int last = 0;
  for (int i = 1; i <= N; i++)
    if (deg[i] & 1)
      if (last)
        Add(i, last), Add(last, i), last = 0;
      else
        last = i;
  if ((sub >> 1) & 1) Add(1, 1), Add(1, 1);
  Init(sub);
  Dfs(1);
  printf("%d\n", sub >> 1);
  for (int i = 1; i <= t; i++)
    if (i & 1)
      printf("%d %d\n", edge[s[i]].u, edge[s[i]].v);
    else
      printf("%d %d\n", edge[s[i]].v, edge[s[i]].u);
  return 0;
}
