#include <bits/stdc++.h>
using namespace std;
const int maxn = 1 << 20;
vector<int> adj[maxn], euler;
vector<int>::iterator ite[maxn];
int edge[maxn << 1], edge_size, vis[maxn << 1], use[maxn];
void link(int u, int v) {
  adj[u].emplace_back(edge_size);
  adj[v].emplace_back(edge_size);
  edge[edge_size++] = u ^ v;
}
void dfs(int u) {
  while (ite[u] != adj[u].end()) {
    if (!vis[*ite[u]]) {
      vis[*ite[u]] = 1;
      dfs(u ^ edge[*ite[u]]);
    }
    if (ite[u] == adj[u].end()) break;
    ++ite[u];
  }
  euler.emplace_back(u);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, m;
  cin >> n >> m;
  while (m--) {
    int u, v;
    cin >> u >> v;
    link(u, v);
  }
  for (int u = 1; u <= n; ++u)
    if (adj[u].size() & 1) link(0, u);
  for (int u = 0; u <= n; ++u) ite[u] = adj[u].begin();
  dfs(0);
  memset(vis, 0, sizeof(vis));
  vector<pair<int, int>> res;
  for (int i = 1; i + 1 < int(euler.size()); ++i) {
    use[euler[i]] = 1;
    if (euler[i - 1] && euler[i] && !(euler[i + 1] && vis[i - 1])) {
      res.emplace_back(euler[i - 1], euler[i]);
      vis[i] = 1;
    }
  }
  for (int u = 1; u <= n; ++u)
    if (!use[u]) {
      euler.clear();
      dfs(u);
      for (int i = 1; i < int(euler.size()); i += 2)
        res.emplace_back(euler[i ^ 1], euler[i]);
      if (euler.size() & 1 && euler.size() >> 1)
        res.emplace_back(euler[euler.size() - 2], euler.back());
    }
  cout << res.size() << '\n';
  for (const auto& ans : res) cout << ans.first << ' ' << ans.second << '\n';
}
