#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
int n, m;
set<int> adj[N];
set<pair<int, int> > edges;
void input() {
  scanf("%d %d", &n, &m);
  int u, v;
  for (int i = (0); i < (m); i++) {
    scanf("%d %d", &u, &v);
    adj[u].insert(v);
    adj[v].insert(u);
    if (u > v) {
      swap(u, v);
    }
    edges.insert(pair<int, int>(u, v));
  }
}
bool done[N];
void dfsCCs(int u, vector<int> &cc) {
  done[u] = true;
  cc.push_back(u);
  for (int v : adj[u]) {
    if (!done[v]) {
      dfsCCs(v, cc);
    }
  }
}
void getCCs(vector<vector<int> > &ccs) {
  for (int i = (1); i <= (n); i++) {
    if (!done[i]) {
      vector<int> cc;
      dfsCCs(i, cc);
      ccs.push_back(cc);
    }
  }
}
vector<int> eulerCycle;
void dfsEuler(int u) {
  while (adj[u].size()) {
    int v = *adj[u].begin();
    adj[u].erase(adj[u].begin());
    adj[v].erase(adj[v].find(u));
    dfsEuler(v);
  }
  eulerCycle.push_back(u);
}
void getEulerCycle(vector<int> &cc) {
  eulerCycle.clear();
  dfsEuler(cc.front());
}
void solve() {
  vector<vector<int> > ccs;
  getCCs(ccs);
  for (vector<int> &cc : ccs) {
    adj[0].clear();
    for (int u : cc) {
      if (adj[u].size() % 2) {
        adj[u].insert(0);
        adj[0].insert(u);
      }
    }
    getEulerCycle(cc);
    int sz = eulerCycle.size();
    int w, x, y, z;
    for (int i = 3; i < sz; i++) {
      w = eulerCycle[i - 3];
      x = eulerCycle[i - 2];
      y = eulerCycle[i - 1];
      z = eulerCycle[i];
      if (w and x and y and z) {
        edges.erase(pair<int, int>(x, y));
        edges.erase(pair<int, int>(y, x));
        i++;
      }
    }
  }
}
void output() {
  printf("%d\n", (int)edges.size());
  for (pair<int, int> e : edges) {
    printf("%d %d\n", e.first, e.second);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie();
  {
    input();
    solve();
    output();
  }
  return 0;
}
