#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 12, maxm = 5e5 + 12, mod = 1e9 + 7;
int n, m, bad[maxn], sz, e[maxm], u, v;
hash<long long> hasher;
struct HASH {
  size_t operator()(const pair<int, int> &x) const {
    return hasher((long long)x.first * n + x.second);
  }
};
struct EQ {
  bool operator()(const pair<int, int> &x, const pair<int, int> &y) const {
    return x == y;
  }
};
unordered_map<pair<int, int>, int, HASH, EQ> id;
vector<int> g[maxn];
void dfs(const int &v = 0) {
  while (g[v].size()) {
    int u = g[v].back();
    g[v].pop_back();
    if (id[{min(u, v), max(u, v)}]) id[{min(u, v), max(u, v)}]--, dfs(u);
  }
  e[sz++] = v;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++)
    scanf("%d%d", &v, &u), g[v - 1].push_back(u - 1), g[u - 1].push_back(v - 1),
        id[{min(u - 1, v - 1), max(u - 1, v - 1)}]++;
  for (int i = 0; i < n; i++)
    if (g[i].size() & 1) bad[sz++] = i;
  for (int i = 0; i < sz; i += 2)
    g[bad[i]].push_back(bad[i + 1]), g[bad[i + 1]].push_back(bad[i]),
        id[{min(bad[i], bad[i + 1]), max(bad[i], bad[i + 1])}]++;
  sz = 0;
  dfs();
  if (!(sz & 1)) e[sz++] = e[sz - 1];
  sz--;
  printf("%d\n", sz);
  bool q = 0;
  for (int i = 0; i < sz; i++, q ^= 1)
    q ? printf("%d %d\n", e[i] + 1, e[i + 1] + 1)
      : printf("%d %d\n", e[i + 1] + 1, e[i] + 1);
  return 0;
}
