#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int u, v, used;
  Edge() {}
  Edge(int u, int v, int used) : u(u), v(v), used(used) {}
  int get_v(int p) { return (u == p) ? v : u; }
};
vector<vector<int> > adj;
vector<Edge> ve;
vector<int> cId, od, id;
int n;
void add_edge(int u, int v) {
  Edge e = Edge(u, v, 0);
  adj[u].push_back(ve.size());
  od[u]++;
  id[v]++;
  adj[v].push_back(ve.size());
  od[v]++;
  id[u]++;
  ve.push_back(e);
}
vector<int> find_path() {
  int st = -1, cnt = 0;
  for (int i = 0; i < n; ++i) {
    if (st == -1 && od[i]) st = i;
    int d = od[i];
    if (d % 2 != 0) st = i, cnt++;
    if (cnt > 2) return vector<int>();
  }
  stack<int> stk;
  stk.push(st);
  vector<int> ret;
  while (stk.size()) {
    int u = stk.top();
    bool found = false;
    while (cId[u] < adj[u].size()) {
      Edge &e = ve[adj[u][cId[u]++]];
      if (e.used) continue;
      e.used = true;
      int v = e.get_v(u);
      found = true;
      stk.push(v);
      break;
    }
    if (!found) {
      stk.pop();
      ret.push_back(u);
    }
  }
  reverse(ret.begin(), ret.end());
  return ret;
}
int main() {
  int m;
  cin >> n >> m;
  od = vector<int>(n);
  id = vector<int>(n);
  adj = vector<vector<int> >(n);
  cId = vector<int>(n);
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    add_edge(a, b);
  }
  vector<int> odd;
  for (int i = 0, p = -1; i < n; ++i) {
    if (adj[i].size() % 2 == 1) {
      odd.push_back(i);
    }
  }
  for (int i = 0; i < (int)odd.size(); i += 2) {
    add_edge(odd[i], odd[i + 1]);
    m++;
  }
  vector<int> a = find_path();
  cout << m + (m % 2 == 1) << "\n";
  for (int i = 0; i + 1 < (int)a.size(); i++) {
    if (i % 2 == 0)
      cout << a[i] + 1 << " " << a[i + 1] + 1 << "\n";
    else
      cout << a[i + 1] + 1 << " " << a[i] + 1 << "\n";
  }
  if (m % 2 == 1) cout << a[m] + 1 << " " << 1 << "\n";
}
