#include <bits/stdc++.h>
using namespace std;
int n, m;
struct edge {
  int from;
  int to;
  int next;
} E[500005 << 1];
int head[100005];
int deg[100005];
int tmp[500005];
int used[500005 << 1];
int size = 1;
void add_edge(int u, int v) {
  size++;
  E[size].from = u;
  E[size].to = v;
  E[size].next = head[u];
  head[u] = size;
}
stack<int> s, ans;
void euler() {
  s.push(1);
  while (!s.empty()) {
    int x = s.top();
    int i = head[x];
    while (i != 0 && used[i] == 1) i = E[i].next;
    if (i != 0) {
      s.push(E[i].to);
      used[i] = used[i ^ 1] = 1;
      head[x] = E[i].next;
    } else {
      s.pop();
      ans.push(x);
    }
  }
}
int main() {
  int u, v;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &u, &v);
    add_edge(u, v);
    add_edge(v, u);
    deg[u]++;
    deg[v]++;
  }
  int pre = 0;
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    if (deg[i] % 2 == 1) {
      if (pre != 0) {
        add_edge(pre, i);
        add_edge(i, pre);
        pre = 0;
      } else
        pre = i;
    }
  }
  if (((size - 1) / 2) % 2 == 1) {
    add_edge(1, 1);
    size++;
  }
  euler();
  printf("%d\n", (size - 1) / 2);
  int ptr = 0;
  while (!ans.empty()) {
    tmp[++ptr] = ans.top();
    ans.pop();
  }
  for (int i = 1; i <= ptr - 1; i++) {
    if (i & 1)
      printf("%d %d\n", tmp[i], tmp[i + 1]);
    else
      printf("%d %d\n", tmp[i + 1], tmp[i]);
  }
}
