#include <bits/stdc++.h>
using namespace std;
int main() {
  long long N, M;
  cin >> N >> M;
  vector<vector<tuple<long long, long long, long long>>> AdjL(N);
  for (long long m = 0; m < M; ++m) {
    long long n1, n2;
    cin >> n1 >> n2;
    --n1;
    --n2;
    AdjL[n1].push_back(
        make_tuple(n2, AdjL[n2].size() + (n1 == n2 ? 1 : 0), false));
    AdjL[n2].push_back(make_tuple(n1, AdjL[n1].size() - 1, false));
  }
  vector<long long> odd;
  for (long long n = 0; n < N; ++n) {
    long long ctr = AdjL[n].size();
    if (ctr % 2 != 0) {
      odd.push_back(n);
    }
  }
  for (long long i = 0; i < odd.size(); i += 2) {
    long long n1 = odd[i];
    long long n2 = (i + 1 == odd.size() ? odd[i] : odd[i + 1]);
    AdjL[n1].push_back(
        make_tuple(n2, AdjL[n2].size() + (n1 == n2 ? 1 : 0), false));
    AdjL[n2].push_back(make_tuple(n1, AdjL[n1].size() - 1, false));
    ++M;
  }
  if (M % 2 != 0) {
    AdjL[0].push_back(make_tuple(0, AdjL[0].size() + 1, false));
    AdjL[0].push_back(make_tuple(0, AdjL[0].size() - 1, false));
    ++M;
  }
  vector<long long> cycle;
  function<void(long long)> euler = [&](long long n_now) {
    while (AdjL[n_now].size() && get<2>(AdjL[n_now].back())) {
      AdjL[n_now].pop_back();
    }
    while (AdjL[n_now].size()) {
      auto& e_now = AdjL[n_now].back();
      get<2>(e_now) = true;
      get<2>(AdjL[get<0>(e_now)][get<1>(e_now)]) = true;
      euler(get<0>(e_now));
      while (AdjL[n_now].size() && get<2>(AdjL[n_now].back())) {
        AdjL[n_now].pop_back();
      }
    }
    cycle.push_back(n_now);
  };
  euler(0);
  cout << cycle.size() - 1 << endl;
  for (long long i = 1; i < cycle.size() - 1; i += 2) {
    cout << cycle[i] + 1 << " " << cycle[i - 1] + 1 << endl;
    cout << cycle[i] + 1 << " " << cycle[i + 1] + 1 << endl;
  }
}
