#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  char c = getchar();
  int x = 0;
  for (; c < '0' || c > '9'; c = getchar())
    ;
  for (; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
  return x;
}
const int N = 1e5 + 5, M = 5e5 + 5;
int head[N], nxt[M], to[M], id[M], n, m, tot, deg[N];
bool vis[M];
vector<int> s;
void addedge(int u, int v, int i) {
  nxt[++tot] = head[u], head[u] = tot, to[tot] = v, id[tot] = i;
}
void dfs(int u) {
  for (int& e = head[u]; e; e = nxt[e])
    if (!vis[id[e]]) vis[id[e]] = true, dfs(to[e]);
  s.push_back(u);
}
int main() {
  n = gi(), m = gi();
  for (int i = 1; i <= m; ++i) {
    int u = gi(), v = gi();
    addedge(u, v, i), addedge(v, u, i);
    ++deg[u], ++deg[v];
  }
  for (int i = 1; i <= n; ++i)
    if (deg[i] & 1) s.push_back(i);
  while (!s.empty()) {
    int u = s.back();
    s.pop_back();
    int v = s.back();
    s.pop_back();
    addedge(u, v, ++m), addedge(v, u, m);
  }
  if (m & 1) addedge(1, 1, ++m);
  dfs(1);
  printf("%d\n", m);
  for (int i = 0; i + 1 < s.size(); ++i) {
    if (i & 1)
      printf("%d %d\n", s[i], s[i + 1]);
    else
      printf("%d %d\n", s[i + 1], s[i]);
  }
}
