#include <bits/stdc++.h>
using namespace std;
struct tree {
  int u, v, next, d;
} l[201000];
struct node {
  int x, y, fx, fy;
} q[10100];
const int inf = 1 << 30;
int n, m, lian[10100], e = 1, be, en, dep[10100];
void build(int);
void bian(int, int, int);
int dinic();
bool bfs();
int dfs(int, int);
int main() {
  scanf("%d%d", &n, &m);
  be = n + m + 1;
  en = be + 1;
  for (int i = 1; i <= m; i++) scanf("%d%d", &q[i].x, &q[i].y);
  if (!m) {
    printf("0");
    return 0;
  }
  int le = 1, ri = n, ans = 0;
  while (le <= ri) {
    int mid = (le + ri) >> 1;
    build(mid);
    if (dinic() == m) {
      ans = mid;
      ri = mid - 1;
    } else
      le = mid + 1;
  }
  printf("%d\n", ans);
  build(ans);
  dinic();
  for (int i = 1; i <= m; i++) {
    if (l[q[i].fx].d == 0)
      printf("%d %d\n", q[i].x, q[i].y);
    else
      printf("%d %d\n", q[i].y, q[i].x);
  }
  return 0;
}
void build(int x) {
  e = 1;
  memset(lian, 0, sizeof(lian));
  for (int i = 1; i <= n; i++) bian(be, i, x);
  for (int i = 1; i <= m; i++) {
    q[i].fx = e + 1;
    bian(q[i].x, i + n, 1);
    q[i].fy = e + 1;
    bian(q[i].y, i + n, 1);
    bian(i + n, en, 1);
  }
}
void bian(int x, int y, int z) {
  e++;
  l[e].u = x;
  l[e].v = y;
  l[e].d = z;
  l[e].next = lian[x];
  lian[x] = e;
  e++;
  l[e].u = y;
  l[e].v = x;
  l[e].d = 0;
  l[e].next = lian[y];
  lian[y] = e;
}
int dinic() {
  int ans = 0;
  while (bfs() == 1) ans += dfs(be, inf);
  return ans;
}
bool bfs() {
  memset(dep, 0, sizeof(dep));
  queue<int> que;
  que.push(be);
  dep[be] = 1;
  while (que.empty() == 0) {
    int x = que.front();
    que.pop();
    for (int i = lian[x]; i; i = l[i].next) {
      int v = l[i].v;
      if (l[i].d > 0 && !dep[v]) {
        dep[v] = dep[x] + 1;
        if (v == en) return true;
        que.push(v);
      }
    }
  }
  return false;
}
int dfs(int x, int y) {
  if (x == en || !y) return y;
  int ans = 0;
  for (int i = lian[x]; i; i = l[i].next) {
    int v = l[i].v;
    if (dep[v] == dep[x] + 1 && l[i].d > 0) {
      int k = dfs(v, (l[i].d < y ? l[i].d : y));
      if (!k) {
        dep[v] = 0;
        continue;
      }
      ans += k;
      y -= k;
      l[i].d -= k;
      l[i ^ 1].d += k;
      if (!y) break;
    }
  }
  return ans;
}
