#include <bits/stdc++.h>
using namespace std;
const int N = 200 * 1000 + 5;
int n, m;
vector<pair<int, int> > g[N];
int pos[N];
int d[N];
int dsu[N], rk[N];
int getp(int v) { return dsu[v] == v ? v : dsu[v] = getp(dsu[v]); }
void unite(int a, int b) {
  a = getp(a);
  b = getp(b);
  if (a == b) return;
  if (rk[a] < rk[b]) swap(a, b);
  dsu[b] = a;
  rk[a] += rk[a] == rk[b];
}
bool read() {
  if (scanf("%d %d", &n, &m) != 2) return false;
  for (int i = 0; i < int(n); ++i) dsu[i] = i, rk[i] = 0;
  for (int i = 0; i < int(m); ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    --a, --b;
    g[a].push_back(make_pair(b, i));
    g[b].push_back(make_pair(a, i));
    d[a]++;
    d[b]++;
    unite(a, b);
  }
  return true;
}
bool used[N * 5];
int ssz;
int seq[N * 5];
void fleury(int v) {
  for (; pos[v] < int(g[v].size()); ++pos[v]) {
    int i = pos[v];
    if (used[g[v][i].second]) continue;
    used[g[v][i].second] = true;
    fleury(g[v][i].first);
  }
  seq[ssz++] = v;
}
void solve() {
  for (int i = 0; i < int(n); ++i) assert(getp(i) == getp(0));
  vector<int> odd;
  for (int i = 0; i < int(n); ++i) {
    if (d[i] & 1) odd.push_back(i);
  }
  assert((int(odd.size()) & 1) == 0);
  for (int i = 0; i < int(int(odd.size()) / 2); ++i) {
    int a = odd[i * 2];
    int b = odd[i * 2 + 1];
    g[a].push_back(make_pair(b, m));
    g[b].push_back(make_pair(a, m++));
  }
  if (m & 1) g[0].push_back(make_pair(0, m++));
  fleury(0);
  printf("%d\n", ssz - 1);
  for (int i = 0; i < int(ssz / 2); ++i) {
    int x = i * 2;
    printf("%d %d\n", seq[x] + 1, seq[x + 1] + 1);
    printf("%d %d\n", seq[x + 2] + 1, seq[x + 1] + 1);
  }
}
int main() {
  while (read()) solve();
  return 0;
}
