#include <bits/stdc++.h>
using namespace std;
const int inft = 1000000009;
const int MAXN = 100005, MAXM = 1000006;
pair<int, int> edges[MAXM];
int n;
vector<int> adj[MAXN];
int cc;
int cycle[MAXM];
int cur[MAXN], stackedge[MAXM];
bool taken[MAXM];
int ep, sp;
void search(int vv) {
  int v = vv;
  while (1) {
    while (cur[v] != adj[v].size()) {
      while (cur[v] != adj[v].size() && taken[adj[v][cur[v]]]) cur[v]++;
      if (cur[v] == adj[v].size()) break;
      int e = adj[v][cur[v]++];
      stackedge[sp++] = e;
      if (v == edges[e].second) swap(edges[e].first, edges[e].second);
      v = edges[e].second;
      taken[e] = 1;
      continue;
      cycle[cc++] = e;
    }
    sp--;
    if (sp < 0) break;
    int e = stackedge[sp];
    cycle[cc++] = e;
    v = edges[e].first;
  }
}
void compute_cycle() {
  for (int i = 0; i < (n + 1); ++i)
    if (i) search(i);
}
void addedge(int a, int b) {
  edges[ep] = pair<int, int>(a, b);
  adj[a].push_back(ep);
  adj[b].push_back(ep);
  ep++;
}
void clear() {
  for (int i = 0; i < (n); ++i) adj[i].clear();
  cc = 0;
  ep = 0;
  sp = 0;
  for (int v = 0; v < (n); ++v) cur[v] = 0;
}
int deg[MAXN];
void solve() {
  int m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (m); ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    addedge(a, b);
    deg[a]++;
    deg[b]++;
  }
  vector<int> A;
  for (int i = 0; i < (n + 1); ++i)
    if (deg[i] % 2) A.push_back(i);
  for (int i = 0; i < A.size(); i += 2) {
    addedge(A[i], A[i + 1]);
    m++;
  }
  if (m % 2) addedge(1, 1);
  compute_cycle();
  printf("%d\n", cc);
  for (int i = 0; i < (cc); ++i) {
    int e = cycle[i];
    if (i % 2) swap(edges[e].first, edges[e].second);
    printf("%d %d\n", edges[e].first, edges[e].second);
    ;
  }
}
int main() {
  int t = 1;
  for (int i = 0; i < (t); ++i) solve();
  return 0;
}
