#include <bits/stdc++.h>
using namespace std;
const int maxn = 100007;
int n, m, deg[maxn];
multiset<int> a[maxn];
stack<int> mys;
vector<int> lst, euler;
int main() {
  scanf("%d%d", &n, &m);
  memset(deg, 0, sizeof(deg));
  int u, v;
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &u, &v);
    a[u].insert(v);
    a[v].insert(u);
    ++deg[u];
    ++deg[v];
  }
  for (int i = 1; i <= n; ++i)
    if (deg[i] & 1) lst.push_back(i);
  for (int i = 0; i < int(lst.size()); i += 2) {
    assert(i + 1 != int(lst.size()));
    int u = lst[i], v = lst[i + 1];
    a[u].insert(v);
    a[v].insert(u);
  }
  mys.push(1);
  while (!mys.empty()) {
    int u = mys.top();
    if (a[u].empty()) {
      euler.push_back(u);
      mys.pop();
    } else {
      int v = *a[u].begin();
      a[u].erase(a[u].begin());
      a[v].erase(a[v].find(u));
      mys.push(v);
    }
  }
  if (int(euler.size()) % 2 == 0) euler.push_back(euler[0]);
  printf("%d\n", int(euler.size()) - 1);
  for (int i = 0; i < int(euler.size()) - 1; ++i) {
    int u = euler[i], v = euler[i + 1];
    if (i & 1) swap(u, v);
    printf("%d %d\n", u, v);
  }
}
