#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int v, code;
  Edge(int a, int b) {
    v = a;
    code = b;
  }
  Edge() {}
} temp;
bool operator<(Edge a, Edge b) { return a.v < b.v; }
multiset<Edge> g[100000];
int degree[100000];
int even[100000];
int path[100000];
bool mark[1000000];
int cnt = 0;
int p;
void Add_Edge(int a, int b) {
  cnt++;
  g[a].insert(Edge(b, cnt));
  g[b].insert(Edge(a, cnt));
  mark[cnt] = false;
}
void Euler(int x) {
  while (!g[x].empty()) {
    temp = *g[x].begin();
    g[x].erase(g[x].begin());
    if (mark[temp.code])
      continue;
    else
      mark[temp.code] = true;
    Euler(temp.v);
  }
  path[++p] = x;
}
int main() {
  int n, m;
  int a, b;
  cin >> n >> m;
  cnt = 0;
  for (int i = 1; i <= n; i++) {
    g[i].clear();
    degree[i] = 0;
  }
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &a, &b);
    Add_Edge(a, b);
    degree[a]++;
    degree[b]++;
  }
  int tot = 0;
  int Ans = m;
  for (int i = 1; i <= n; i++)
    if (degree[i] & 1) {
      even[tot++] = i;
    }
  for (int i = 0; i < tot; i += 2) {
    Add_Edge(even[i], even[i + 1]);
    Ans++;
  }
  cout << ((Ans & 1) ? Ans + 1 : Ans) << endl;
  p = 0;
  Euler(1);
  for (int i = 1; i < p; i++) {
    if (i & 1)
      printf("%d %d\n", path[i + 1], path[i]);
    else
      printf("%d %d\n", path[i], path[i + 1]);
  }
  if (!(p & 1)) printf("1 1\n");
  return 0;
}
