#include <bits/stdc++.h>
struct Edge {
  int from, to;
  bool done;
  Edge(int from, int to) : from(from), to(to), done(false) {}
};
struct Node {
  std::vector<int> edge_id;
  int self_cyc;
  int it;
  Node() : edge_id(), self_cyc(0), it(-1) {}
};
void DFS(std::vector<Node> &nodes, std::vector<Edge> &edges, int curr,
         std::vector<int> *result) {
  int &i = nodes[curr].it;
  for (++i; i < nodes[curr].edge_id.size(); ++i) {
    int id = nodes[curr].edge_id[i];
    if (edges[id].done) {
      continue;
    }
    edges[id].done = true;
    DFS(nodes, edges, edges[id].from + edges[id].to - curr, result);
    result->push_back(curr);
  }
}
void Connect(std::vector<Node> &nodes, std::vector<Edge> &edges, int a, int b) {
  if (a == b) {
    nodes[a].self_cyc += 1;
  } else {
    nodes[a].edge_id.push_back(edges.size());
    nodes[b].edge_id.push_back(edges.size());
  }
  edges.push_back(Edge(a, b));
}
int main() {
  for (int n, m; ~scanf("%d %d", &n, &m);) {
    std::vector<Node> nodes(n + 1);
    std::vector<Edge> edges;
    for (int i = 0; i < m; ++i) {
      int a, b;
      scanf("%d %d", &a, &b);
      Connect(nodes, edges, a, b);
    }
    int last_odd = -1;
    for (int i = 1; i <= n; ++i) {
      if (nodes[i].edge_id.size() % 2 == 1) {
        if (last_odd == -1) {
          last_odd = i;
        } else {
          Connect(nodes, edges, last_odd, i);
          last_odd = -1;
        }
      }
    }
    if (edges.size() % 2 == 1) {
      Connect(nodes, edges, 1, 1);
    }
    std::vector<int> path;
    DFS(nodes, edges, 1, &path);
    if (path.size() > 0) {
      path.push_back(path.front());
    }
    printf("%d\n", static_cast<int>(edges.size()));
    bool to_left = false;
    for (int i = 0; i + 1 < path.size(); ++i) {
      if (nodes[path[i]].self_cyc % 2 == 1) {
        nodes[path[i]].self_cyc = 0;
      } else {
        to_left = !to_left;
      }
      if (to_left) {
        printf("%d %d\n", path[i + 1], path[i]);
      } else {
        printf("%d %d\n", path[i], path[i + 1]);
      }
    }
    for (int i = 0; i < edges.size(); ++i) {
      if (edges[i].from == edges[i].to) {
        printf("%d %d\n", edges[i].from, edges[i].to);
      }
    }
  }
  return 0;
}
