#include <bits/stdc++.h>
using namespace std;
int n, m, in[100005], E;
set<int> adj[100005];
pair<int, int> edge[300005];
vector<int> tmp, path;
void euler(int now) {
  while (!adj[now].empty()) {
    int Enum = *adj[now].begin();
    adj[now].erase(Enum);
    int nxt = edge[Enum].first;
    if (nxt == now) nxt = edge[Enum].second;
    if (nxt != now) {
      adj[nxt].erase(Enum);
    }
    euler(nxt);
    path.push_back(nxt);
  }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &edge[i].first, &edge[i].second);
    adj[edge[i].first].insert(i);
    adj[edge[i].second].insert(i);
    ++in[edge[i].first];
    ++in[edge[i].second];
  }
  E = m;
  for (int i = 1; i <= n; i++) {
    if (in[i] & 1) {
      tmp.push_back(i);
    }
  }
  while (!tmp.empty()) {
    ++E;
    if ((int)tmp.size() == 1) {
      edge[E] = {tmp.back(), tmp.back()};
      adj[tmp.back()].insert(E);
      break;
    }
    int p = tmp.back();
    tmp.pop_back();
    int p2 = tmp.back();
    tmp.pop_back();
    edge[E] = {p, p2};
    adj[p].insert(E);
    adj[p2].insert(E);
  }
  if (E & 1) {
    ++E;
    edge[E] = {1, 1};
    adj[1].insert(E);
  }
  vector<pair<int, int> > ans;
  for (int i = 1; i <= n; i++) {
    path.clear();
    euler(i);
    for (int j = 1; j < path.size(); j += 2) {
      ans.push_back({path[j], path[j - 1]});
      ans.push_back({path[j], path[(j + 1) % (int)path.size()]});
    }
  }
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
