#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "inline")
using namespace std;
template <class T>
inline void read(T &x) {
  int ch = 0, f = 0;
  x = 0;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = 1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
  if (f) x = -x;
}
const int N = 500005;
vector<int> g[N];
unordered_map<int, int> mp[N];
int a[N], id[N], deg[N], gao[N], n, m, cnt, top, gaoflag;
inline void dfs(int u) {
  for (int &i = id[u]; i < (int)g[u].size(); i++) {
    int v = g[u][i];
    if (mp[min(u, v)][max(u, v)] == 0) continue;
    mp[min(u, v)][max(u, v)]--;
    dfs(v);
    if ((++top) & 1)
      printf("%d %d\n", u, v);
    else
      printf("%d %d\n", v, u);
  }
}
int main() {
  read(n), read(m);
  for (int i = 1, x, y; i <= m; i++) {
    read(x), read(y);
    g[x].push_back(y);
    g[y].push_back(x);
    mp[min(x, y)][max(x, y)]++;
  }
  for (int i = 1; i <= n; i++)
    if ((int)g[i].size() % 2 == 1) a[++cnt] = i;
  for (int i = 1; i <= cnt; i += 2) {
    g[a[i]].push_back(a[i + 1]);
    g[a[i + 1]].push_back(a[i]);
    mp[min(a[i], a[i + 1])][max(a[i], a[i + 1])]++;
    m++;
  }
  if (m & 1) g[1].push_back(1), mp[1][1]++, m++;
  printf("%d\n", m);
  dfs(1);
  return 0;
}
