#include <bits/stdc++.h>
using namespace std;
const int N = 4e4 + 1;
int n, m, rem, p[N], last[N], id, x[N], y[N], freq[N], q[N], taken[N];
bool op[N];
struct edge {
  int u, v, c, last;
  edge() { u = -1; }
} e[N];
void addEdge(int u, int v, int c) {
  e[rem].u = u;
  e[rem].v = v;
  e[rem].c = c;
  e[rem].last = last[u];
  last[u] = rem++;
  e[rem].u = v;
  e[rem].v = u;
  e[rem].c = 0;
  e[rem].last = last[v];
  last[v] = rem++;
}
bool getPath() {
  int l = 0, r = 0;
  for (int i = 1; i <= n + m; i++) p[i] = -1;
  p[N - 1] = -1;
  for (; l <= r; l++) {
    int at = last[q[l]];
    while (at != -1) {
      if (e[at].c && p[e[at].v] == -1) q[++r] = e[at].v, p[e[at].v] = at;
      at = e[at].last;
    }
  }
  return p[N - 1] != -1;
}
int MaxFlow() {
  int flow = 0;
  while (getPath()) {
    int mn = 1e9;
    for (int cur = N - 1; cur; cur = e[p[cur]].u) mn = min(mn, e[p[cur]].c);
    for (int cur = N - 1; cur; cur = e[p[cur]].u)
      e[p[cur]].c -= mn, e[p[cur] ^ 1].c += mn;
    flow += mn;
  }
  return flow;
}
int main() {
  scanf("%d%d", &n, &m);
  if (!m) return puts("0"), 0;
  memset(last, -1, sizeof last);
  for (int i = 0; i < m; i++)
    scanf("%d %d", x + i, y + i), x[i], y[i], freq[x[i]]++, freq[y[i]]++;
  for (int i = 1; i <= n; i++) addEdge(0, i, 1), taken[i] = freq[i], freq[i]--;
  id = n + 1;
  for (int i = 0; i < m; i++)
    addEdge(x[i], id, 1), addEdge(y[i], id, 1), addEdge(id++, N - 1, 1);
  int bst = 0, flow = 0;
  while (1) {
    flow += MaxFlow();
    if (flow == m) break;
    for (int i = 0; i < 2 * n; i += 2)
      if (freq[e[i].v] && !e[i].c) {
        e[i].c++;
        freq[e[i].v]--;
      }
  }
  for (int i = 1; i < 2 * n; i += 2) bst = max(bst, abs(e[i].c));
  printf("%d\n", bst);
  for (int i = 2 * n; e[i].u != -1; i += 6) op[e[i].v] = e[i].c;
  ;
  for (int i = 0; i < m; i++)
    if (op[n + i + 1])
      printf("%d %d\n", y[i], x[i]);
    else
      printf("%d %d\n", x[i], y[i]);
}
