#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 6;
int deg[maxn];
int head[maxn], to[maxn << 2], nex[maxn << 2], now = -1, vis_p[maxn];
bool vis[maxn << 2];
void add(int a, int b) {
  nex[++now] = head[a];
  head[a] = now;
  to[now] = b;
}
vector<pair<int, int> > ans;
int S[maxn << 2], top;
void dfs(int p) {
  vis_p[p]++;
  int id_now = vis_p[p];
  for (int i = head[p]; ~i; i = nex[i]) {
    head[p] = nex[i];
    if (vis[i]) continue;
    vis[i] = 1;
    vis[i ^ 1] = 1;
    dfs(to[i]);
    if (vis_p[p] > id_now) break;
  }
  S[++top] = p;
}
int main() {
  memset(head, -1, sizeof head);
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = (int)(1); i <= (int)(m); i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    deg[a]++;
    deg[b]++;
    add(a, b);
    add(b, a);
  }
  for (int i = (int)(1); i <= (int)(n); i++) {
    if (deg[i] & 1) add(0, i), add(i, 0);
  }
  for (int i = (int)(1); i <= (int)(n); i++) {
    if (!vis_p[i]) {
      top = 0;
      dfs(i);
      for (int j = 1; j + 1 <= top; j += 2) {
        if (S[j] && S[j + 1]) ans.push_back({S[j], S[j + 1]});
      }
      for (int j = 2; j + 1 <= top; j += 2) {
        int ne = j + 2;
        if (j + 1 == top) ne = 2;
        if (!(S[j - 1] && S[j] && S[j + 1] && S[ne]) && S[j] && S[j + 1])
          ans.push_back({S[j], S[j + 1]});
      }
    }
  }
  printf("%d\n", ans.size());
  for (auto p : ans) {
    printf("%d %d\n", p.first, p.second);
  }
}
