#include <bits/stdc++.h>
using namespace std;
const int maxn = 111111;
struct EDGE {
  int u, v, next;
  bool vis;
} edge[maxn << 4];
int head[maxn], E;
void add_edge(int u, int v) {
  edge[E].u = u;
  edge[E].v = v;
  edge[E].next = head[u];
  edge[E].vis = false;
  head[u] = E++;
}
int ans[maxn << 4], top, cnt;
void dfs(int u) {
  int &i = head[u];
  while (~i) {
    int v = edge[i].v, pre = i;
    i = edge[i].next;
    if (!edge[pre].vis) {
      edge[pre].vis = edge[pre ^ 1].vis = true;
      dfs(v);
      ans[--cnt] = pre;
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  E = 0;
  memset(head, -1, sizeof(head));
  static int deg[maxn];
  top = m;
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    add_edge(u, v);
    add_edge(v, u);
    deg[u]++;
    deg[v]++;
  }
  vector<int> odd;
  for (int i = 1; i <= n; ++i) {
    if (deg[i] & 1) {
      if (odd.empty()) {
        odd.push_back(i);
      } else {
        int u = odd.back();
        odd.pop_back();
        int v = i;
        add_edge(u, v);
        add_edge(v, u);
        deg[u]++;
        deg[v]++;
        top++;
      }
    }
  }
  if (!odd.empty()) {
    int u = odd.back();
    add_edge(u, u);
    add_edge(u, u);
    top++;
  }
  if (top & 1) {
    add_edge(1, 1);
    add_edge(1, 1);
    top++;
  }
  cnt = top;
  dfs(1);
  cout << top << endl;
  for (int i = 0; i < top; ++i) {
    int u = edge[ans[i]].u, v = edge[ans[i]].v;
    if (i & 1) {
      swap(u, v);
    }
    cout << u << " " << v << endl;
  }
  return 0;
}
