#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
std::pair<T, U> operator+(const std::pair<T, U> &l, const std::pair<T, U> &r) {
  return {l.first + r.first, l.second + r.second};
}
typedef void (*callback_function)(void);
const long long ZERO = 0LL;
const long long INF64 = 1e18;
const int INF32 = 1e9;
const int MOD = 1e9 + 7;
const long double PI = acos(-1.0L);
const long double EPS = static_cast<long double>(1e-9);
long long inv(long long a, long long b) {
  if (a != 1) {
    return b - (inv(b % a, a) * b) / a;
  }
  return 1;
}
inline int Pow(int a, int k) {
  int s = 1;
  for (; k; k >>= 1) {
    k & 1 ? s = 1LL * s * a % MOD : 0;
    a = 1LL * a * a % MOD;
  }
  return s;
}
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);
    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) {
        adj[x].erase(y);
        adj[y].erase(x);
        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;
}
