#include <bits/stdc++.h>
using namespace std;
template <int MV>
class UndirectedEulerPath {
 public:
  vector<int> path;
  multiset<int> E[MV];
  void add_path(int x, int y) {
    E[x].insert(y);
    E[y].insert(x);
  }
  void dfs(int cur) {
    while (E[cur].size()) {
      int tar = *E[cur].begin();
      E[cur].erase(E[cur].begin());
      E[tar].erase(E[tar].find(cur));
      dfs(tar);
    }
    path.push_back(cur);
  }
  bool GetPath() {
    int fo = -1, odd = 0, i, np = 0;
    for (i = 0; i < MV; i++) {
      np += E[i].size();
      if (E[i].size() % 2) odd++, fo = (fo == -1) ? i : fo;
    }
    if (odd != 0 && odd != 2) return false;
    dfs(odd ? fo : 0);
    reverse(path.begin(), path.end());
    return path.size() == np / 2 + 1;
  }
};
int N, M;
int in[101000];
multiset<int> E[101000];
UndirectedEulerPath<101000> uep;
void solve() {
  int i, j, k, l, r, x, y;
  string s;
  cin >> N >> M;
  for (i = 0; i < M; i++) {
    cin >> x >> y;
    x--, y--;
    if (x > y) swap(x, y);
    E[x].insert(y);
    in[x]++;
    in[y]++;
  }
  int odd = -1;
  for (i = 0; i < N; i++) {
    if (in[i] % 2) {
      if (odd == -1)
        odd = i;
      else
        E[odd].insert(i), in[i]++, in[odd]++, odd = -1;
    }
  }
  for (i = 0; i < N; i++)
    for (auto& r : E[i]) uep.add_path(i, r);
  uep.GetPath();
  vector<int> V = uep.path;
  if (V.size() % 2 == 0) V.push_back(*V.begin());
  (void)printf("%d\n", V.size() - 1);
  for (i = 0; i < V.size() - 1; i++) {
    if (i % 2)
      (void)printf("%d %d\n", V[i] + 1, V[i + 1] + 1);
    else
      (void)printf("%d %d\n", V[i + 1] + 1, V[i] + 1);
  }
}
int main(int argc, char** argv) {
  string s;
  int i;
  if (argc == 1) ios::sync_with_stdio(false);
  for (i = 0; i < argc - 1; i++) s += argv[i + 1], s += '\n';
  for (i = 0; i < s.size(); i++) ungetc(s[s.size() - 1 - i], stdin);
  solve();
  return 0;
}
