#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1000100;
const long long INF = 2000000100;
const long long MOD = 998244353;
int N, M, L;
int E[MAXN][2];
int D[MAXN];
int sz[MAXN];
vector<pair<int, int> > graph[MAXN];
bool used[MAXN];
priority_queue<pair<int, int> > PQ;
bool usable(int a) { return sz[a] <= 2 * (D[a] - 1); }
int main() {
  ios_base::sync_with_stdio(0);
  cin >> N >> M;
  int a, b;
  for (int i = 0; i < M; i++) {
    cin >> a >> b;
    E[i][0] = a;
    E[i][1] = b;
    D[a]++;
    D[b]++;
    sz[a]++;
    sz[b]++;
    graph[a].push_back(pair<int, int>(i, 1));
    graph[b].push_back(pair<int, int>(i, 0));
  }
  vector<int> ans;
  for (int i = 1; i <= N; i++) PQ.push(pair<int, int>(D[i], i));
  while (!PQ.empty()) {
    pair<int, int> t = PQ.top();
    int n = t.second;
    PQ.pop();
    if (t.first == 0) break;
    if (D[n] != t.first) continue;
    for (int i = 0; i < sz[n]; i++) {
      int c = E[graph[n][i].first][graph[n][i].second];
      if (usable(n) && usable(c)) {
        D[n]--;
        D[c]--;
        PQ.push(pair<int, int>(D[c], c));
      } else {
        if (!used[graph[n][i].first]) ans.push_back(graph[n][i].first);
      }
      used[graph[n][i].first] = 1;
    }
  }
  int K = ans.size();
  cout << K << "\n";
  for (int i = 0; i < K; i++) {
    cout << E[ans[i]][0] << " " << E[ans[i]][1] << "\n";
  }
}
