#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int n, m;
bool vis[maxn];
bool used[maxn << 2];
bool ban[maxn << 2];
struct edge {
  int a, b;
};
vector<edge> edges;
vector<int> g[maxn];
vector<int> euler;
vector<int> ans;
vector<int> st;
void addedge(int a, int b) {
  edges.push_back(edge{a, b});
  edges.push_back(edge{b, a});
  int m = (int)edges.size();
  g[a].push_back(m - 2);
  g[b].push_back(m - 1);
}
void dfs(int o) {
  vis[o] = 1;
  while (st[o] < (int)g[o].size()) {
    int u = g[o][st[o]];
    st[o]++;
    if (used[u]) continue;
    used[u] = used[u ^ 1] = 1;
    dfs(edges[u].b);
    euler.push_back(u ^ 1);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    addedge(a, b);
  }
  int vid = (int)edges.size();
  st.resize(n + 1, 0);
  for (int i = 1; i <= n; i++)
    if (g[i].size() & 1) {
      addedge(0, i);
    }
  for (int i = 0; i <= n; i++)
    if (!vis[i]) {
      dfs(i);
      int sz = (int)euler.size();
      for (int j = 1; j < sz; j += 2) {
        if (euler[j] >= vid) {
          ban[euler[j]] = ban[euler[j] ^ 1] = 1;
          continue;
        }
        int a = (j - 1 + sz) % sz;
        if (euler[a] >= vid && !ban[euler[a]]) {
          ban[euler[a]] = ban[euler[a] ^ 1] = 1;
          continue;
        }
        a = (j + 1) % sz;
        if (euler[a] >= vid && !ban[euler[a]]) {
          ban[euler[a]] = ban[euler[a] ^ 1] = 1;
          continue;
        }
        ban[euler[j]] = ban[euler[j] ^ 1] = 1;
      }
      for (auto& u : euler) {
        if (!ban[u] && u < vid) {
          ans.push_back(u);
        }
      }
      euler.clear();
    }
  printf("%d\n", (int)ans.size());
  for (auto& u : ans) {
    printf("%d %d\n", edges[u].a, edges[u].b);
  }
  return 0;
}
