#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 65;
int V[maxn], U[maxn], n;
vector<int> adj[maxn / 2], ans, E;
bitset<maxn> vmark, mark;
void dfs(int v, int ee) {
  vmark[v] = 1;
  while (adj[v].size()) {
    int e = adj[v].back();
    adj[v].pop_back();
    int u = V[e] ^ U[e] ^ v;
    if (!mark[e]) {
      mark[e] = 1;
      dfs(u, e);
    }
  }
  E.push_back(ee);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int m;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    cin >> V[i] >> U[i];
    V[i]--;
    U[i]--;
    adj[V[i]].push_back(i);
    adj[U[i]].push_back(i);
  }
  int M = m;
  for (int i = 0; i < n; i++) {
    if (adj[i].size() % 2) {
      V[M] = i, U[M] = n;
      adj[i].push_back(M);
      adj[n].push_back(M);
      M++;
    }
  }
  E.push_back(m + 1);
  for (int i = 0; i < n; i++) {
    if (!vmark[i]) {
      dfs(i, m + 1);
    }
  }
  E.pop_back();
  int T = 0;
  for (int i = 0; i < E.size(); i++) {
    if ((!T || (i + 1 < E.size() && E[i + 1] >= m)) && E[i] < m) {
      ans.push_back(E[i]);
    }
    T ^= 1;
    if (E[i] >= m) T = 0;
  }
  cout << ans.size() << '\n';
  for (auto e : ans) {
    cout << V[e] + 1 << ' ' << U[e] + 1 << '\n';
  }
}
