#include <bits/stdc++.h>
using namespace std;
pair<int, int> Edge[1000010];
int deg[100010], E;
queue<int> q;
int head[100010], to[1000010], nxt[1000010];
void add_edge(int u, int v) {
  deg[u]++, deg[v]++;
  nxt[E] = head[u];
  to[E] = v;
  head[u] = E++;
  nxt[E] = head[v];
  to[E] = u;
  head[v] = E++;
}
int flag[100010], vst[1000010];
void dfs(int u) {
  int k = ++flag[u];
  for (int e = head[u]; e != -1; e = nxt[e]) {
    head[u] = nxt[e];
    int v = to[e];
    if (vst[e]) {
      if (flag[u] > k) break;
      continue;
    }
    vst[e] = vst[e ^ 1] = 1;
    dfs(v);
    Edge[E++] = pair<int, int>(u, v);
  }
}
int main() {
  int N, M;
  cin >> N >> M;
  memset(head, -1, sizeof(head));
  int u, v;
  for (int i = 0; i < M; i++) {
    scanf("%d %d", &u, &v);
    add_edge(u, v);
  }
  for (int i = 1; i <= N; i++)
    if (deg[i] & 1) q.push(i);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    int v = q.front();
    q.pop();
    add_edge(u, v), M++;
  }
  if (M & 1) add_edge(1, 1);
  E = 0;
  for (int i = 1; i <= N; i++)
    if (!flag[i]) dfs(i);
  printf("%d\n", E);
  for (int i = 0; i < E; i++) {
    if (i & 1) swap(Edge[i].first, Edge[i].second);
    printf("%d %d\n", Edge[i].first, Edge[i].second);
  }
  return 0;
}
