#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<multiset<int> > g;
vector<pair<int, int> > ans;
vector<int> deg, vec, in, out;
stack<int> st;
void dfs(int);
int main() {
  scanf("%d%d", &n, &m);
  g.resize(n + 1);
  deg.resize(n + 1);
  in.resize(n + 1);
  out.resize(n + 1);
  for (int i = 1; i <= m; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    g[a].insert(b);
    g[b].insert(a);
    deg[a]++;
    deg[b]++;
  }
  for (int i = 1; i <= n; i++)
    if (deg[i] % 2) st.push(i);
  while (!st.empty()) {
    int a = st.top();
    st.pop();
    int b;
    if (st.empty())
      b = a;
    else {
      b = st.top();
      st.pop();
    }
    g[a].insert(b);
    g[b].insert(a);
    deg[a]++;
    deg[b]++;
  }
  dfs(1);
  for (int i = 1; i < vec.size(); i += 2) {
    ans.push_back(make_pair(vec[i], vec[i - 1]));
    in[vec[i - 1]]++;
    out[vec[i]]++;
    if (i + 1 != vec.size()) {
      ans.push_back(make_pair(vec[i], vec[i + 1]));
      in[vec[i + 1]]++;
      out[vec[i]]++;
    }
  }
  for (int i = 1; i <= n; i++)
    if (in[i] % 2 && out[i] % 2) ans.push_back(make_pair(i, i));
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
  return 0;
}
void dfs(int v) {
  while (!g[v].empty()) {
    int to = *g[v].begin();
    g[v].erase(g[v].begin());
    g[to].erase(g[to].lower_bound(v));
    dfs(to);
  }
  vec.push_back(v);
}
