#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
int d[maxn][2], deg[maxn];
vector<int> odd;
vector<pair<int, int> > ans;
vector<int> adj[maxn];
map<pair<int, int>, int> mp;
int n, m;
inline void edge(int v, int u) {
  d[v][0]++;
  d[u][1]++;
  deg[v]++;
  deg[u]++;
  mp[{v, u}]++;
  adj[v].push_back(u);
  adj[u].push_back(v);
}
bool mark[maxn];
inline void sw(int v, int u) {
  mp[{v, u}]--;
  mp[{u, v}]++;
}
inline void SWAP(int v, int u) {
  if (mp[{v, u}])
    sw(v, u);
  else
    sw(u, v);
}
inline void dfs(int v) {
  mark[v] = 1;
  for (auto &(u) : (adj[v]))
    if (!mark[u]) {
      dfs(u);
      if (d[u][0] % 2) SWAP(v, u), d[u][0]++, d[v][0]++;
    }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  while (m--) {
    int v, u;
    cin >> v >> u;
    --v, --u;
    edge(v, u);
  }
  for (int(i) = (0); (i) < (n); ++(i))
    if (deg[i] % 2) odd.push_back(i);
  for (int i = 0; i < odd.size(); i += 2) {
    int v = odd[i], u = odd[i + 1];
    edge(v, u);
  }
  for (int(i) = (0); (i) < (n); ++(i))
    if (!mark[i]) dfs(i);
  for (int(i) = (0); (i) < (n); ++(i))
    if (d[i][0] % 2) edge(i, i);
  for (__typeof((mp).begin()) q = (mp).begin(); q != (mp).end(); ++q) {
    pair<int, int> p = q->first;
    for (int(i) = (0); (i) < (mp[p]); ++(i)) ans.push_back(p);
  }
  cout << ans.size() << endl;
  for (auto &(p) : (ans)) cout << p.first + 1 << ' ' << p.second + 1 << '\n';
}
