#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 10;
struct Edge {
  int v;
  bool used;
  Edge(int v, int used) : v(v), used(used) {}
};
vector<int> adj[MAXN], odd, ans;
vector<Edge> edges;
int p, n, m, deg[MAXN];
int cur[MAXN];
void dfs(int u) {
  for (auto &idx = cur[u]; idx < adj[u].size(); ++idx) {
    if (!edges[adj[u][idx]].used) {
      edges[adj[u][idx]].used = 1;
      edges[adj[u][idx] ^ 1].used = 1;
      dfs(edges[adj[u][idx]].v);
    }
  }
  ans.push_back(u);
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    ++deg[u], ++deg[v];
    edges.emplace_back(v, 0);
    edges.emplace_back(u, 0);
    int sz = edges.size();
    adj[u].push_back(sz - 2);
    adj[v].push_back(sz - 1);
  }
  for (int i = (1); i < (n + 1); ++i)
    if (deg[i] & 1) {
      odd.push_back(i);
    }
  for (int i = 0; i < (int)odd.size(); i += 2) {
    int u = odd[i], v = odd[i + 1];
    edges.emplace_back(v, 0);
    edges.emplace_back(u, 0);
    int sz = edges.size();
    adj[u].push_back(sz - 2);
    adj[v].push_back(sz - 1);
  }
  p = m + (odd.size() / 2);
  dfs(1);
  if (ans.size() % 2 == 0) {
    ++p;
    ans.push_back(1);
  }
  cout << p << '\n';
  for (int i = 1; i < (int)ans.size(); ++i) {
    int u = ans[i - 1], v = ans[i];
    if (!(i & 1)) {
      swap(u, v);
    }
    cout << u << ' ' << v << '\n';
  }
  return 0;
}
