#include <bits/stdc++.h>
using namespace std;
const int maxn = 5000 * 100 + 10;
vector<int> e[maxn], odd, ind[maxn];
int d_ent, d_ext, pt[maxn], t;
bool mark[maxn];
vector<pair<int, int>> ans_edge;
void solve(int v, pair<int, int> edge) {
  while (pt[v] < e[v].size()) {
    if (!mark[ind[v][pt[v]]]) {
      mark[ind[v][pt[v]]] = true;
      solve(e[v][pt[v]], {v, e[v][pt[v]]});
    }
    pt[v]++;
  }
  if (edge.first != -1) {
    if (t % 2) {
      ans_edge.push_back({edge.first, v});
    } else {
      ans_edge.push_back({v, edge.first});
    }
  }
  t++;
  return;
}
int main() {
  ios::sync_with_stdio, cin.tie(0), cout.tie(0);
  int n, m, a, b;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    cin >> a >> b;
    e[a].push_back(b), e[b].push_back(a);
    ind[a].push_back(i), ind[b].push_back(i);
  }
  for (int i = 1; i <= n; i++)
    if (e[i].size() % 2) odd.push_back(i);
  int ans = m;
  m++;
  for (int i = 0; i < odd.size(); i += 2) {
    e[odd[i]].push_back(odd[i + 1]), e[odd[i + 1]].push_back(odd[i]);
    ind[odd[i]].push_back(i + m), ind[odd[i + 1]].push_back(i + m);
    ans++;
  }
  if (ans % 2) {
    e[1].push_back(1), e[1].push_back(1);
    ind[1].push_back(m + odd.size()), ind[1].push_back(m + odd.size());
    ans++;
  }
  solve(1, {-1, -1});
  cout << ans_edge.size() << '\n';
  for (int i = 0; i < ans_edge.size(); i++)
    cout << ans_edge[i].first << ' ' << ans_edge[i].second << '\n';
  return 0;
}
