#include <bits/stdc++.h>
using namespace std;
using G = vector<vector<int>>;
vector<int> eulerian_trail(G &g, int s, vector<int> &used, bool directed) {
  function<void(int, vector<int> &)> dfs = [&](int u, vector<int> &trail) {
    used[u] = true;
    while (!g[u].empty()) {
      int v = g[u].back();
      g[u].pop_back();
      if (!directed) {
        for (int i = 0; i < g[v].size(); i++)
          if (g[v][i] == u) {
            g[v].erase(g[v].begin() + i);
            break;
          }
      }
      dfs(v, trail);
    }
    trail.push_back(u);
  };
  vector<int> trail;
  dfs(s, trail);
  reverse(trail.begin(), trail.end());
  return trail;
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int>> g(n);
  for (int i = 0; i < m; i++) {
    int s, t;
    cin >> s >> t;
    s--, t--;
    g[s].emplace_back(t);
    g[t].emplace_back(s);
  }
  vector<int> odd;
  for (int i = 0; i < n; i++)
    if (g[i].size() & 1) odd.emplace_back(i);
  int add = 0;
  for (int i = 0; i < odd.size(); i += 2) {
    int a = odd[i], b = odd[i + 1];
    g[a].emplace_back(b);
    g[b].emplace_back(a);
    add++;
  }
  if ((m + add) & 1) g[0].emplace_back(0), g[0].emplace_back(0);
  vector<int> used(n, false);
  auto trail = eulerian_trail(g, 0, used, false);
  cout << trail.size() - 1 << endl;
  for (int i = 0; i + 1 < trail.size(); i++) {
    if (i & 1) {
      cout << trail[i] + 1 << " " << trail[i + 1] + 1 << endl;
    } else {
      cout << trail[i + 1] + 1 << " " << trail[i] + 1 << endl;
    }
  }
  return 0;
}
