#include <bits/stdc++.h>
#pragma warning(disable : 6031)
#pragma warning(disable : 4101)
using namespace std;
const int INF = 1e9;
const long long LINF = 1e18;
const double PI = acos(-1);
const int MAXN = 1000006;
int n, m, v1, v2, Deg[MAXN], visited[MAXN];
vector<unordered_set<int>> G;
vector<int> C;
set<pair<int, int>> erased;
void find_component(int v) {
  visited[v] = true;
  C.push_back(v);
  for (int c : G[v]) {
    if (!visited[c]) {
      find_component(c);
    }
  }
}
void eulerian_cycle(int v) {
  stack<int> S;
  vector<int> ans;
  S.push(v);
  while (!S.empty()) {
    int s = S.top();
    if (G[s].empty()) {
      ans.push_back(s);
      S.pop();
    } else {
      int c = *G[s].begin();
      G[s].erase(G[s].begin());
      G[c].erase(s);
      S.push(c);
    }
  }
  int ans_size = ((int)(ans).size());
  for (int i = 1; i < ((int)(ans).size()); i += 2) {
    if (ans[i] != 0 && ans[i + 1] != 0) {
      if (ans[i - 1] != 0 && ans[(i + 2) % ans_size] != 0) {
        if (ans[i] < ans[i + 1]) {
          erased.erase({ans[i], ans[i + 1]});
        } else {
          erased.erase({ans[i + 1], ans[i]});
        }
      }
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  G.resize(n + 1);
  while (m--) {
    scanf("%d%d", &v1, &v2);
    G[v1].insert(v2);
    G[v2].insert(v1);
    if (v1 < v2) {
      erased.insert({v1, v2});
    } else {
      erased.insert({v2, v1});
    }
    Deg[v1]++;
    Deg[v2]++;
  }
  for (int i = 1; i <= n; i++) {
    if (!visited[i]) {
      assert(G[0].empty());
      C.clear();
      find_component(i);
      if (((int)(C).size()) == 1) {
        continue;
      }
      for (int v : C) {
        if (Deg[v] % 2 == 1) {
          G[0].insert(v);
          G[v].insert(0);
        }
      }
      eulerian_cycle(C.front());
    }
  }
  printf("%d\n", ((int)(erased).size()));
  for (pair<int, int> p : erased) {
    printf("%d %d\n", p.first, p.second);
  }
  return 0;
}
