#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void mx(T& x, const T& y) {
  if (x < y) x = y;
}
template <typename T>
inline void mn(T& x, const T& y) {
  if (y < x) x = y;
}
template <typename T>
inline int sz(const T& x) {
  return (int)x.size();
}
vector<int> head;
vector<int> dst;
vector<int> nxt;
vector<int> deg;
vector<bool> used;
void addArc(int u, int v) {
  dst.push_back(v);
  nxt.push_back(head[u]);
  head[u] = dst.size() - 1;
  deg[u]++;
  dst.push_back(u);
  nxt.push_back(head[v]);
  head[v] = dst.size() - 1;
  deg[v]++;
  used.push_back(false);
}
vector<int> ans;
inline void dfs(int u) {
  while (head[u] != -1) {
    int arc = head[u];
    head[u] = nxt[arc];
    if (used[arc >> 1]) {
      continue;
    }
    used[arc >> 1] = true;
    dfs(dst[arc]);
  }
  ans.push_back(u);
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  head.assign(n, -1);
  deg.assign(n, 0);
  for (int i = 0; i < (m); ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    --u, --v;
    addArc(u, v);
  }
  vector<int> odd;
  for (int i = 0; i < (n); ++i) {
    if (deg[i] % 2 == 1) {
      odd.push_back(i);
    }
  }
  for (int i = 0; i < (sz(odd) / 2); ++i) {
    addArc(odd[2 * i + 0], odd[2 * i + 1]);
  }
  if (sz(dst) % 4 != 0) {
    addArc(0, 0);
  }
  dfs(0);
  printf("%d\n", sz(ans) - 1);
  for (int i = 0; i + 1 < sz(ans); ++i) {
    int u = ans[i];
    int v = ans[i + 1];
    if (i & 1) swap(u, v);
    printf("%d %d\n", u + 1, v + 1);
  }
  return 0;
}
