#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<pair<int, int> > e;
bool check(vector<pair<int, int> > res) {
  if (res.size() > (n + m + 1) / 2) return false;
  vector<int> d(n, 0), d2(n, 0);
  for (pair<int, int> i : res) {
    d[--i.first]++;
    d[--i.second]++;
  }
  for (pair<int, int> i : e) {
    d2[--i.first]++;
    d2[--i.second]++;
  }
  for (int i = 0; i < n; i++) {
    if ((d2[i] + 1) / 2 > d[i]) return false;
  }
  return true;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  e.resize(m);
  vector<set<int> > g(n + 1);
  for (int i = 0; i < m; i++) {
    cin >> e[i].first >> e[i].second;
    g[e[i].first].insert(e[i].second);
    g[e[i].second].insert(e[i].first);
  }
  for (int i = 1; i <= n; i++) {
    if ((int)(g[i].size()) & 1) {
      g[i].insert(0);
      g[0].insert(i);
    }
  }
  vector<int> c(n + 1, 0);
  vector<pair<int, int> > res;
  for (int s = 1; s <= n; s++) {
    if (!c[s]) {
      vector<int> st, ep;
      st.push_back(s);
      while (!st.empty()) {
        int f = st.back();
        c[f] = 1;
        if (g[f].empty()) {
          st.pop_back();
          ep.push_back(f);
        } else {
          int v = *g[f].begin();
          g[f].erase(v);
          g[v].erase(f);
          st.push_back(v);
        }
      }
      ep.pop_back();
      for (int i = 0; i < (int)ep.size(); i++) {
        int v0 = ep[(ep.size() + i - 1) % ep.size()], v1 = ep[i],
            v2 = ep[(i + 1) % ep.size()], v3 = ep[(i + 2) % ep.size()];
        if (!v1 || !v2) continue;
        if (!v0 || !v3 || !(i & 1)) {
          res.push_back({v1, v2});
        }
      }
    }
  }
  cout << res.size() << "\n";
  for (pair<int, int> i : res) {
    cout << i.first << " " << i.second << "\n";
  }
  return 0;
}
