#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100, M = 6e5 + 100;
int head[N], nxt[M], to[M], ne, vis[M];
int sz[N];
void init() {
  ne = 0;
  memset(head, -1, sizeof head);
}
void addEdge(int u, int v) {
  nxt[ne] = head[u];
  to[ne] = v;
  head[u] = ne++;
  sz[u]++;
}
void addBiEdge(int u, int v) {
  addEdge(u, v);
  addEdge(v, u);
}
int n, m;
vector<int> out;
void dfs(int cur) {
  for (int &j = head[cur]; j != -1;) {
    int v = to[j], o = j;
    j = nxt[j];
    if (vis[o]) continue;
    vis[o ^ 1] = 1;
    dfs(v);
  }
  out.push_back(cur);
}
int main() {
  init();
  scanf("%d", &n), scanf("%d", &m);
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d", &u), scanf("%d", &v);
    addBiEdge(u, v);
  }
  vector<int> odds;
  for (int i = 1; i <= n; i++)
    if (sz[i] & 1) odds.push_back(i);
  for (int i = 0; i + 1 < odds.size(); i += 2) addBiEdge(odds[i], odds[i + 1]);
  m += odds.size() / 2;
  if (m & 1) addBiEdge(1, 1);
  dfs(1);
  reverse(out.begin(), out.end());
  cout << out.size() - 1 << endl;
  for (int i = 0; i + 1 < out.size(); i++) {
    if (i & 1)
      printf("%d %d\n", out[i], out[i + 1]);
    else
      printf("%d %d\n", out[i + 1], out[i]);
  }
}
