#include <bits/stdc++.h>
using namespace std;
struct node {
  int v, edge;
  node() {}
  node(int V, int E) {
    v = V;
    edge = E;
  }
};
vector<pair<int, int> > result;
vector<node> G[1000005];
int n, m, cnt, Top;
int d[1000005];
int last[1000005];
int tag_time[1000005];
int sta[1000005 << 2];
bool vis[1000005 << 2];
void dfs(int u) {
  tag_time[u]++;
  int ip = tag_time[u];
  for (int i = last[u]; i < G[u].size(); i++) {
    int v = G[u][i].v, num = G[u][i].edge;
    last[u] = i + 1;
    if (vis[num]) continue;
    vis[num] = 1;
    dfs(v);
    if (tag_time[u] > ip) break;
  }
  sta[++Top] = u;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    cnt++;
    G[u].push_back(node(v, cnt));
    G[v].push_back(node(u, cnt));
    d[u]++;
    d[v]++;
  }
  for (int i = 1; i <= n; i++)
    if (d[i] & 1) {
      cnt++;
      G[i].push_back(node(0, cnt));
      G[0].push_back(node(i, cnt));
    }
  for (int i = 1; i <= n; i++) {
    if (!tag_time[i]) {
      Top = 0;
      dfs(i);
      for (int j = 1; j + 1 <= Top; j += 2)
        if (sta[j] && sta[j + 1])
          result.push_back(make_pair(sta[j], sta[j + 1]));
      for (int j = 2; j + 1 <= Top; j += 2) {
        int opt = j + 2;
        if (j + 1 == Top) opt = 2;
        if (!(sta[j] && sta[j - 1] && sta[j + 1] && sta[opt]) && sta[j] &&
            sta[j + 1])
          result.push_back(make_pair(sta[j], sta[j + 1]));
      }
    }
  }
  printf("%d\n", result.size());
  for (int i = 0; i < result.size(); i++)
    printf("%d %d\n", result[i].first, result[i].second);
  return 0;
}
