#include <bits/stdc++.h>
using namespace std;
const int M = 4200000;
namespace io {
const int L = (1 << 21) + 1;
char ibuf[L], *iS, *iT, obuf[L], *oS = obuf, *oT = obuf + L - 1, c, st[65];
int f, tp;
inline void flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
inline void putc(char x) {
  *oS++ = x;
  if (oS == oT) flush();
}
inline void read(int &x) {
  for (f = 1, c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                              (iS == iT ? EOF : *iS++))
                            : *iS++);
       c < '0' || c > '9';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    if (c == '-') f = -1;
  for (x = 0; c <= '9' && c >= '0';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    x = x * 10 + (c & 15);
  x *= f;
}
inline void print(int x) {
  if (!x) putc('0');
  if (x < 0) putc('-'), x = -x;
  while (x) st[++tp] = x % 10 + '0', x /= 10;
  while (tp) putc(st[tp--]);
}
inline void read(long long &x) {
  for (f = 1, c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                              (iS == iT ? EOF : *iS++))
                            : *iS++);
       c < '0' || c > '9';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    if (c == '-') f = -1;
  for (x = 0; c <= '9' && c >= '0';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    x = x * 10 + (c & 15);
  x *= f;
}
inline void print(long long x) {
  if (!x) putc('0');
  if (x < 0) putc('-'), x = -x;
  while (x) st[++tp] = x % 10 + '0', x /= 10;
  while (tp) putc(st[tp--]);
}
inline void read(char *s, int &l) {
  for (c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++);
       c < 33; c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                               (iS == iT ? EOF : *iS++))
                             : *iS++))
    ;
  for (l = 0; c > 32;
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    s[l++] = c;
  s[l] = '\0';
}
inline void read(char *s) {
  int l;
  for (c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++);
       c < 33; c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                               (iS == iT ? EOF : *iS++))
                             : *iS++))
    ;
  for (l = 0; c > 32;
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, L, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    s[l++] = c;
  s[l] = '\0';
}
inline void print(char *s) {
  for (int l = 0; s[l] != '\0'; ++l) putc(s[l]);
}
};  // namespace io
using io::print;
using io::putc;
using io::read;
struct edge {
  int fr, to, nx;
} e[M];
int n, m;
int cnt = 2;
int h[M] = {0};
void add(int u, int v) {
  e[cnt].fr = u;
  e[cnt].nx = h[u];
  e[cnt].to = v;
  h[u] = cnt++;
}
int dgree[M] = {0};
int im;
bool vir(int x) { return x > im; }
int eula[M];
int tp = 0;
vector<int> ans;
bool vsp[M];
bool vse[M];
void dfs(int u, int p) {
  vsp[u] = 1;
  for (int &i = h[u]; i; i = e[i].nx) {
    if (vse[i] || vse[i ^ 1]) continue;
    vse[i] = 1;
    dfs(e[i].to, i);
  }
  eula[tp++] = p;
}
bool del[M];
void solve(int x) {
  tp = 0;
  dfs(x, 0);
  --tp;
  for (int i = (0); i <= (tp); ++i) del[i] = 0;
  for (int i = 1; i < tp; i += 2) {
    int a = eula[i - 1], b = eula[i], c = eula[(i + 1) % tp];
    if (b > im)
      del[i] = 1;
    else {
      if (a > im)
        del[i - 1] = 1;
      else if (c > im)
        del[(i + 1) % tp] = 1;
      else
        del[i] = 1;
    }
  }
  for (int i = (0); i <= (tp - 1); ++i)
    if (!del[i] && eula[i] <= im) {
      ans.push_back(eula[i]);
    }
}
int main() {
  read(n);
  read(m);
  int u, v;
  for (int i = (1); i <= (m); ++i) {
    read(u);
    read(v);
    add(u, v);
    add(v, u);
    ++dgree[u];
    ++dgree[v];
  }
  im = cnt - 1;
  for (int i = (1); i <= (n); ++i)
    if (dgree[i] & 1) {
      add(i, 0);
      add(0, i);
    }
  for (int i = (1); i <= (n); ++i)
    if (!vsp[i]) solve(i);
  print((int)ans.size());
  putc('\n');
  for (int i : ans) {
    print(e[i].fr);
    putc(' ');
    print(e[i].to);
    putc('\n');
  }
  io::flush();
  return 0;
}
