#include <bits/stdc++.h>
using namespace std;
long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = (_tmp * _tmp) % _mod;
  if (_x & 1) _tmp = (_tmp * _a) % _mod;
  return _tmp;
}
bool equal(double _x, double _y) { return _x > _y - 1e-7 && _x < _y + 1e-7; }
int __ = 1, cs;
int n, m, deg[100010];
multiset<int> S[100010];
vector<int> odd;
void build() {}
void init() {
  n = getint();
  m = getint();
  while (m--) {
    int u, v;
    u = getint();
    v = getint();
    S[u].insert(v);
    S[v].insert(u);
    deg[u]++;
    deg[v]++;
  }
  for (int i = 1; i <= n; i++)
    if (deg[i] % 2) odd.push_back(i);
  if ((int)odd.size() % 2) assert(1 == 0);
  for (int i = 0, j = (int)odd.size() - 1; i < j; i++, j--) {
    S[odd[i]].insert(odd[j]);
    S[odd[j]].insert(odd[i]);
  }
}
vector<pair<int, int> > ans;
int got;
void DFS(int now) {
  while (S[now].size()) {
    multiset<int>::iterator it = S[now].begin();
    int des = *it;
    S[now].erase(S[now].find(des));
    S[des].erase(S[des].find(now));
    DFS(des);
    got++;
    if (got % 2)
      ans.push_back(make_pair(des, now));
    else
      ans.push_back(make_pair(now, des));
  }
}
void find_circle() {
  for (int i = 1; i <= n; i++)
    while ((int)S[i].size() > 0) {
      got = 0;
      DFS(i);
      if (got % 2) ans.push_back(make_pair(i, i));
    }
}
void solve() {
  find_circle();
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < (int)ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
