#include <bits/stdc++.h>
using namespace std;
int n, m, st[350005], dr[350005], grad[350005], bad[350005], l, order[350005],
    len;
bool used[350005], stare[350005];
vector<int> L[350005];
vector<int>::iterator it[350005];
inline void add_edge(int x, int y) {
  ++m;
  L[x].push_back(m);
  L[y].push_back(m);
  st[m] = x;
  dr[m] = y;
}
inline void Dfs(int nod) {
  while (it[nod] != L[nod].end()) {
    if (used[*it[nod]]) {
      ++it[nod];
      continue;
    }
    used[*it[nod]] = 1;
    Dfs(st[*it[nod]] + dr[*it[nod]] - nod);
  }
  order[++len] = nod;
}
int main() {
  int i, j, x, y;
  cin >> n >> m;
  for (i = 1; i <= m; ++i) {
    cin >> st[i] >> dr[i];
    L[st[i]].push_back(i);
    L[dr[i]].push_back(i);
    ++grad[st[i]];
    ++grad[dr[i]];
  }
  for (i = 1; i <= n; ++i)
    if (grad[i] & 1) bad[++l] = i;
  for (i = 1; i < l; i += 2) add_edge(bad[i], bad[i + 1]);
  if (m & 1) add_edge(1, 1);
  for (i = 1; i <= n; ++i) it[i] = L[i].begin();
  Dfs(1);
  cout << m << "\n";
  for (i = 1; i < len; ++i) {
    x = order[i];
    y = order[i + 1];
    if (!stare[x]) {
      cout << y << " " << x << "\n";
      stare[y] = 1;
    } else {
      cout << x << " " << y << "\n";
      stare[y] = 0;
    }
  }
  return 0;
}
