#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > e;
vector<set<int> > v;
vector<bool> vis;
void getCycle(int nod, vector<int> &cycle) {
  while (!v[nod].empty()) {
    int p = *v[nod].begin();
    v[nod].erase(p);
    v[p].erase(nod);
    getCycle(p, cycle);
  }
  vis[nod] = true;
  cycle.push_back(nod);
}
void solve(int nod) {
  vector<int> cycle;
  vector<pair<int, int> > edges;
  getCycle(nod, cycle);
  for (int i = 1; i < cycle.size(); i++)
    edges.push_back({cycle[i - 1], cycle[i]});
  int m = edges.size();
  for (int i = 0; i < m; i++)
    if (i & 1) {
      if (edges[i].first && edges[i].second) {
        int j = (i - 1 + m) % m;
        if (edges[j].first == 0 || edges[j].second == 0) {
          e.push_back(edges[i]);
          continue;
        }
        j = (i + 1 + m) % m;
        if (edges[j].first == 0 || edges[j].second == 0) {
          e.push_back(edges[i]);
          continue;
        }
      }
    } else {
      if (edges[i].first && edges[i].second) e.push_back(edges[i]);
    }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  v.resize(n + 1);
  vis.resize(n + 1);
  while (m--) {
    int x, y;
    cin >> x >> y;
    v[x].insert(y);
    v[y].insert(x);
  }
  for (int i = 1; i <= n; i++)
    if ((int)v[i].size() & 1) {
      v[0].insert(i);
      v[i].insert(0);
    }
  for (int i = 0; i <= n; i++)
    if (vis[i] == false) solve(i);
  cout << (int)e.size() << '\n';
  for (auto i : e) cout << i.first << ' ' << i.second << '\n';
}
