#include <bits/stdc++.h>
using namespace std;
int n, m, tot, head[600100], to[600100], nxt[600100], deg[600100];
bool vis[600100];
void add_edge(int u, int v) {
  nxt[tot] = head[u], head[u] = tot, to[tot] = v, tot++;
  nxt[tot] = head[v], head[v] = tot, to[tot] = u, tot++;
}
int T, ord[600100];
void dfs(int e) {
  vis[e >> 1] = 1;
  int x = to[e];
  for (int &p = head[x]; ~p; p = nxt[p]) {
    if (vis[p >> 1]) continue;
    dfs(p);
  }
  ord[--T] = e;
}
int main() {
  scanf("%d %d", &n, &m);
  memset(head, -1, sizeof head);
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    add_edge(u, v);
    deg[u]++, deg[v]++;
  }
  vector<int> vec;
  for (int i = 1; i <= n; i++)
    if (deg[i] & 1) vec.push_back(i);
  int sz = vec.size();
  m += sz / 2;
  for (int i = 0; i < sz; i += 2) add_edge(vec[i], vec[i + 1]);
  if (m & 1) m++, add_edge(1, 1);
  assert(tot == m * 2);
  T = m, dfs(0);
  assert(T == 0);
  printf("%d\n", m);
  for (int i = 0; i < m; i++) {
    int x = ord[i];
    if (i & 1)
      printf("%d %d\n", to[x], to[x ^ 1]);
    else
      printf("%d %d\n", to[x ^ 1], to[x]);
  }
  return 0;
}
