#include <bits/stdc++.h>
using namespace std;
static const int INF = 0x3f3f3f3f;
static const long long INFL = 0x3f3f3f3f3f3f3f3fLL;
static const int MOD = 1000000007;
static const double PI = 3.14159265358979;
template <typename T>
void pv(T a, T b) {
  for (T i = a; i != b; i++) cout << *i << " ";
  cout << endl;
}
template <typename T, typename U>
inline void amin(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
inline void amax(T &x, U y) {
  if (x < y) x = y;
}
int in() {
  int _x;
  scanf("%d", &_x);
  return _x;
}
vector<int> g[101010];
void visit(int s, vector<int> &path) {
  while (!g[s].empty()) {
    int next = g[s].back();
    g[s].pop_back();
    for (int(j) = 0; (j) < (int)((int)(g[next].size())); (j)++) {
      if (g[next][j] == s) {
        g[next].erase(g[next].begin() + j);
        break;
      }
    }
    visit(next, path);
  }
  path.push_back(s);
}
signed main() {
  int n, m;
  cin >> n >> m;
  for (int(i) = 0; (i) < (int)(m); (i)++) {
    int a = in(), b = in();
    a--, b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  vector<int> odd;
  for (int(i) = 0; (i) < (int)(n); (i)++)
    if ((int)(g[i].size()) & 1) odd.push_back(i);
  int cnt = 0;
  for (int(i) = 0; (i) < (int)((int)(odd.size())); (i)++) {
    g[odd[i]].push_back(odd[i + 1]);
    g[odd[i + 1]].push_back(odd[i]);
    i++;
    cnt++;
  }
  vector<int> path;
  visit(0, path);
  reverse((path).begin(), (path).end());
  vector<pair<int, int> > ans;
  for (int(i) = 0; (i) < (int)((int)(path.size()) - 1); (i)++) {
    if (i & 1)
      ans.push_back(make_pair((path[i]), (path[i + 1])));
    else
      ans.push_back(make_pair((path[i + 1]), (path[i])));
  }
  if ((m + cnt) & 1) ans.push_back(make_pair((0), (0)));
  cout << (int)(ans.size()) << endl;
  for (int(i) = 0; (i) < (int)((int)(ans.size())); (i)++)
    cout << ans[i].first + 1 << ' ' << ans[i].second + 1 << endl;
  return 0;
}
