#include <bits/stdc++.h>
using namespace std;
bool SR(int &x) { return scanf("%d", &x) == 1; }
bool SR(long long &x) { return scanf("%lld", &x) == 1; }
bool SR(double &x) { return scanf("%lf", &x) == 1; }
bool SR(char *s) { return scanf("%s", s) == 1; }
bool RI() { return true; }
template <typename I, typename... T>
bool RI(I &x, T &...tail) {
  return SR(x) && RI(tail...);
}
void SP(const int x) { printf("%d", x); }
void SP(const long long x) { printf("%lld", x); }
void SP(const double x) { printf("%.16lf", x); }
void SP(const char *s) { printf("%s", s); }
void PL() { puts(""); }
template <typename I, typename... T>
void PL(const I x, const T... tail) {
  SP(x);
  if (sizeof...(tail)) putchar(' ');
  PL(tail...);
}
const int V = 1e5 + 5;
const int E = 1e6 + 6;
vector<int> to;
vector<int> edge[V];
int n, m;
void read() {
  RI(n, m);
  for (int i = 0; i < int(m); i++) {
    int a, b;
    RI(a, b);
    edge[a].push_back(((int)(to).size()));
    to.push_back(b);
    edge[b].push_back(((int)(to).size()));
    to.push_back(a);
  }
}
void build() {
  for (int i = (1); i <= int(n); i++)
    if (((int)(edge[i]).size()) % 2) {
      int j = i + 1;
      while (((int)(edge[j]).size()) % 2 == 0) j++;
      edge[i].push_back(((int)(to).size()));
      to.push_back(j);
      edge[j].push_back(((int)(to).size()));
      to.push_back(i);
    }
  if (((int)(to).size()) % 4 == 2)
    for (int i = 0; i < int(2); i++) {
      edge[1].push_back(((int)(to).size()));
      to.push_back(1);
    }
}
vector<int> ans;
bitset<E> del;
void dfs(int u) {
  while (((int)(edge[u]).size())) {
    int cur = edge[u].back();
    edge[u].pop_back();
    if (del[cur] || del[cur ^ 1]) continue;
    del[cur] = 1;
    dfs(to[cur]);
  }
  ans.push_back(u);
}
void sol() {
  dfs(1);
  ans.pop_back();
  int mm = ((int)(ans).size());
  PL(mm);
  for (int i = 0; i < int(mm); i++) {
    if (i % 2 == 0)
      PL(ans[i], ans[(i + 1) % mm]);
    else
      PL(ans[(i + 1) % mm], ans[i]);
  }
}
int main() {
  read();
  build();
  sol();
  return 0;
}
