#include <bits/stdc++.h>
using namespace std;
const int N = 5055;
int n, m;
int ax[N], ay[N];
int head[N], np[N * 8], p[N * 8], flow[N * 8], tot;
int S, T;
void init() {
  for (int i = (int)1; i <= (int)tot; i++) flow[i] = p[i] = np[i] = 0;
  for (int i = (int)1; i <= (int)T; i++) head[i] = 0;
  tot = 1;
  S = n + 1;
  T = n + 2;
}
inline int add(int a, int b, int c) {
  ++tot;
  p[tot] = b;
  np[tot] = head[a];
  head[a] = tot;
  flow[tot] = c;
  ++tot;
  p[tot] = a;
  np[tot] = head[b];
  head[b] = tot;
  return tot;
}
int dis[N];
int q[N];
int dinic(int x, int ff) {
  if (!ff) return 0;
  if (x == T) return ff;
  int ret = 0;
  for (int u = head[x]; u; u = np[u])
    if (dis[p[u]] == dis[x] + 1)
      if (flow[u]) {
        int tmp = dinic(p[u], min(ff, flow[u]));
        ff -= tmp;
        ret += tmp;
        flow[u] -= tmp;
        flow[u ^ 1] += tmp;
        if (!ff) break;
      }
  if (!ret) dis[x] = -1;
  return ret;
}
int bfs() {
  for (int i = (int)1; i <= (int)T; i++) dis[i] = -1;
  dis[S] = 0;
  q[q[0] = 1] = S;
  for (int i = (int)1; i <= (int)q[0]; i++) {
    int x = q[i];
    for (int u = head[x]; u; u = np[u])
      if (flow[u])
        if (dis[p[u]] == -1) {
          dis[p[u]] = dis[x] + 1;
          q[++q[0]] = p[u];
        }
  }
  return dis[T];
}
int du[N];
bool check(int dd) {
  memset(du, 0, sizeof du);
  for (int i = (int)1; i <= (int)m; i++) du[ax[i]]++;
  init();
  int need = 0;
  for (int i = (int)1; i <= (int)n; i++) {
    if (du[i] > dd) {
      add(S, i, du[i] - dd);
      need += du[i] - dd;
    } else if (du[i] < dd)
      add(i, T, dd - du[i]);
  }
  for (int i = (int)1; i <= (int)m; i++) add(ax[i], ay[i], 1);
  while (bfs() != -1) need -= dinic(S, 1e9);
  return !need;
}
int id[N];
void prtans(int dd) {
  memset(du, 0, sizeof du);
  for (int i = (int)1; i <= (int)m; i++) du[ax[i]]++;
  init();
  int need = 0;
  for (int i = (int)1; i <= (int)n; i++) {
    if (du[i] > dd) {
      add(S, i, du[i] - dd);
      need += du[i] - dd;
    } else if (du[i] < dd)
      add(i, T, dd - du[i]);
  }
  for (int i = (int)1; i <= (int)m; i++) id[i] = add(ax[i], ay[i], 1);
  while (bfs() != -1) need -= dinic(S, 1e9);
  for (int i = (int)1; i <= (int)m; i++)
    if (flow[id[i]])
      printf("%d %d\n", ay[i], ax[i]);
    else
      printf("%d %d\n", ax[i], ay[i]);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (int)1; i <= (int)m; i++) scanf("%d%d", &ax[i], &ay[i]);
  int l = 0;
  int r = n;
  int ans = 0;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (check(mid))
      ans = mid, r = mid;
    else
      l = mid + 1;
  }
  if (check(l)) ans = l;
  printf("%d\n", ans);
  prtans(ans);
  return 0;
}
