#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const double eps = 1e-9;
const int inf = 2000000000;
const long long infLL = 9000000000000000000;
inline bool EQ(double a, double b) { return fabs(a - b) < 1e-9; }
inline long long gcd(long long a, long long b) {
  return b == 0 ? a : gcd(b, a % b);
}
inline long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
int dx[] = {0, 0, +1, -1, +1, +1, -1, -1};
int dy[] = {+1, -1, 0, 0, +1, -1, +1, -1};
template <typename first, typename second>
ostream &operator<<(ostream &os, const pair<first, second> &p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  os << "{";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> &v) {
  os << "[";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "]";
}
template <typename T>
ostream &operator<<(ostream &os, const multiset<T> &v) {
  os << "[";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ", ";
    os << *it;
  }
  return os << "]";
}
template <typename first, typename second>
ostream &operator<<(ostream &os, const map<first, second> &v) {
  os << "[";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ", ";
    os << it->first << " = " << it->second;
  }
  return os << "]";
}
void faltu() { cerr << '\n'; }
template <typename T>
void faltu(T a[], int n) {
  for (int i = 0; i < n; ++i) cerr << a[i] << ' ';
  cerr << '\n';
}
template <typename T, typename... hello>
void faltu(T arg, const hello &...rest) {
  cerr << arg << ' ';
  faltu(rest...);
}
const int mx = 1e6 + 123;
vector<pair<int, int> > Deleted, eular;
vector<int> eularCycle;
bool vis[mx];
int cnt[mx];
set<pair<int, int> > edges;
set<int> adj[mx];
int n, m;
void findCycle(int u) {
  while (!adj[u].empty()) {
    int v = *(adj[u].begin());
    adj[u].erase(v);
    adj[v].erase(u);
    findCycle(v);
  }
  eularCycle.push_back(u);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].insert(v);
    adj[v].insert(u);
    cnt[v]++;
    cnt[u]++;
    edges.insert({u, v});
  }
  int c = m;
  for (int i = 1; i <= n; i++) {
    if (cnt[i] % 2) {
      adj[0].insert(i);
      adj[i].insert(0);
    }
  }
  for (int ii = 0; ii <= n; ii++) {
    eularCycle.clear();
    eular.clear();
    findCycle(ii);
    for (int i = 0; i < (int)eularCycle.size() - 1; i++) {
      eular.push_back({eularCycle[i], eularCycle[i + 1]});
    }
    bool yes = 0;
    for (int i = 0; i < (int)eular.size(); i++) {
      if (yes) {
        if (eular[i].first != 0 && eular[i].second != 0) {
          if (i - 1 >= 0 &&
              (eular[i - 1].first == 0 || eular[i - 1].second == 0)) {
            yes = 1;
          } else if (i + 1 < (int)eular.size() &&
                     (eular[i + 1].first == 0 || eular[i + 1].second == 0)) {
            yes = 0;
            i++;
          } else {
            Deleted.push_back(eular[i]);
            yes = 0;
          }
        } else
          yes = 0;
      } else
        yes = 1;
    }
  }
  for (auto u : Deleted) {
    edges.erase({u.first, u.second});
    edges.erase({u.second, u.first});
  }
  cout << (int)edges.size() << '\n';
  for (auto u : edges) {
    cout << u.first << " " << u.second << '\n';
  }
  return 0;
}
