#include <bits/stdc++.h>
using namespace std;
int N, M;
int deg[100005], pos[100005];
bool V[300005];
vector<int> con[100005], cone[100005];
int main() {
  ios_base::sync_with_stdio(false);
  cin >> N >> M;
  for (int i = 1; i <= M; i++) {
    int a, b;
    cin >> a >> b;
    deg[a]++;
    deg[b]++;
    con[a].push_back(b);
    cone[a].push_back(i);
    con[b].push_back(a);
    cone[b].push_back(i);
  }
  vector<int> arr;
  for (int i = 1; i <= N; i++)
    if (deg[i] & 1) arr.push_back(i);
  for (int i = 0; i < ((int)(arr).size()); i += 2) {
    con[arr[i]].push_back(arr[i + 1]);
    cone[arr[i]].push_back(++M);
    con[arr[i + 1]].push_back(arr[i]);
    cone[arr[i + 1]].push_back(M);
  }
  if (M & 1) con[1].push_back(1), cone[1].push_back(++M);
  vector<int> path;
  stack<int> stk;
  stk.push(1);
  while (!stk.empty()) {
    int top = stk.top();
    bool sw = 0;
    for (int i = pos[top]; i < ((int)(con[top]).size()); i++) {
      int e = cone[top][i], t = con[top][i];
      if (V[e]) continue;
      V[e] = 1;
      stk.push(t);
      pos[top] = i + 1;
      sw = 1;
      break;
    }
    if (!sw) {
      pos[top] = ((int)(con[top]).size());
      path.push_back(top);
      stk.pop();
    }
  }
  printf("%d\n", M);
  for (int i = 1; i < ((int)(path).size()); i++) {
    if (i & 1)
      printf("%d %d\n", path[i - 1], path[i]);
    else
      printf("%d %d\n", path[i], path[i - 1]);
  }
}
