#include <bits/stdc++.h>
using namespace std;
struct EDGE {
  int to, next;
} e[4000010];
int head[1000010], top, in[1000010], eid[4000010], cnt[1000010];
bool vis[1000010], evis[4000010], vvis[4000010];
int hhead[1000010];
int ans[4000100], anstop;
void add(int u, int v) {
  in[u]++;
  e[top].to = v;
  e[top].next = head[u];
  head[u] = top++;
}
void dfs(int x) {
  vis[x] = 1;
  int temp;
  for (int &i = head[x]; ~i;) {
    temp = i;
    i = e[i].next;
    if (evis[temp]) continue;
    evis[temp] = evis[temp ^ 1] = 1;
    dfs(e[temp].to);
    ans[++anstop] = e[temp].to;
    eid[anstop] = temp;
  }
}
int ss[4000010], stop;
int main() {
  memset(head, 255, sizeof(head));
  int n, m;
  scanf("%d%d", &n, &m);
  int i;
  int u, v;
  for (i = 0; i < m; i++) {
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }
  for (i = 1; i <= n; i++) {
    if (in[i] & 1) {
      add(0, i);
      add(i, 0);
    }
  }
  memcpy(hhead, head, sizeof(head));
  int sum = 0;
  for (i = 1; i <= n; i++) {
    if (!vis[i]) {
      dfs(i);
      ans[++anstop] = i;
      int j;
      for (j = 1; j < anstop; j += 2) {
        if (!ans[j]) {
          cnt[ans[j + 1]]++;
          continue;
        }
        if (!ans[j + 1]) {
          cnt[ans[j]]++;
          continue;
        }
        vvis[eid[j]] = vvis[eid[j] ^ 1] = 1;
        sum++;
        ss[++stop] = ans[j];
        ss[++stop] = ans[j + 1];
      }
      anstop = 0;
    }
  }
  memcpy(head, hhead, sizeof(head));
  for (i = 1; i <= n; i++) {
    if (cnt[i] > 0) {
      int j;
      for (j = head[i]; ~j; j = e[j].next) {
        if (vvis[j]) continue;
        if (e[j].to == 0) continue;
        ss[++stop] = i;
        ss[++stop] = e[j].to;
        sum++;
        cnt[i]--;
        cnt[e[j].to]--;
        vvis[j] = vvis[j ^ 1] = 1;
        break;
      }
    }
  }
  printf("%d\n", sum);
  int sss = 0;
  for (i = 0; i < sum; i++) {
    printf("%d %d\n", ss[++sss], ss[++sss]);
  }
  return 0;
}
