#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
template <class T>
typename T::value_type arr_sum(const T& v, int n) {
  typename T::value_type sum = 0;
  for (int i = (0); i < (n); ++i) sum += v[i];
  return sum;
}
struct Sync_stdio {
  Sync_stdio() {
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
  }
} _sync_stdio;
vector<int> res;
vector<multiset<int>> g;
void euler_path(int t) {
  stack<int> st;
  st.push(t);
  while (!st.empty()) {
    int p = st.top();
    if (g[p].empty()) {
      res.push_back(p);
      st.pop();
    } else {
      int s = *g[p].begin();
      auto it = g[p].find(s);
      if (it != g[p].end()) {
        g[p].erase(it);
      }
      it = g[s].find(p);
      if (it != g[s].end()) {
        g[s].erase(it);
      }
      st.push(s);
    }
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  g.resize(n);
  vector<int> deg(n);
  for (int i = (0); i < (m); ++i) {
    int a, b;
    cin >> a >> b;
    --a, --b;
    g[a].insert(b);
    g[b].insert(a);
    ++deg[a];
    ++deg[b];
  }
  int t = -1;
  for (int i = (0); i < (n); ++i) {
    if (deg[i] % 2) {
      if (t == -1) {
        t = i;
      } else {
        g[t].insert(i);
        g[i].insert(t);
        ++deg[t];
        ++deg[i];
        t = -1;
      }
    }
  }
  if (accumulate(deg.begin(), deg.end(), 0) % 4) {
    g[0].insert(0);
    g[0].insert(0);
  }
  euler_path(0);
  cout << res.size() - 1 << "\n";
  for (int i = (0); i < (res.size() - 1); ++i) {
    int a = i;
    int b = i + 1;
    if (a % 2 == 0) {
      swap(a, b);
    }
    cout << res[a] + 1 << " " << res[b] + 1 << "\n";
  }
}
