#include <bits/stdc++.h>
using namespace std;
const int MaxN = 5e3;
const int Inf = 1 << 30;
struct Edge {
  int to, nxt, val;
} e[8 * MaxN + 5];
int head[2 * MaxN + 5], tot;
int U[MaxN + 5], V[MaxN + 5], n, m;
int s, t, cur[2 * MaxN + 5], d[2 * MaxN + 5];
bool vis[2 * MaxN + 5];
inline void add_edge(int u, int v, int w) {
  e[tot].to = v;
  e[tot].val = w;
  e[tot].nxt = head[u];
  head[u] = tot++;
  e[tot].to = u;
  e[tot].val = 0;
  e[tot].nxt = head[v];
  head[v] = tot++;
}
int PP = 0;
bool BFS() {
  for (int i = s; i <= t; ++i) vis[i] = false;
  queue<int> q;
  q.push(s);
  d[s] = 0;
  vis[s] = true;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = head[x]; i != -1; i = e[i].nxt) {
      if (!vis[e[i].to] && e[i].val) {
        vis[e[i].to] = true;
        d[e[i].to] = d[x] + 1;
        q.push(e[i].to);
      }
    }
  }
  return vis[t];
}
int DFS(int x, int a) {
  if (x == t || a == 0) return a;
  int flow = 0, f;
  for (int &i = cur[x]; i != -1; i = e[i].nxt) {
    if (d[x] + 1 == d[e[i].to] && (f = DFS(e[i].to, min(a, e[i].val))) > 0) {
      e[i].val -= f;
      e[i ^ 1].val += f;
      flow += f;
      a -= f;
      if (a == 0) break;
    }
  }
  return flow;
}
int max_flow() {
  int flow = 0;
  while (BFS()) {
    for (int i = s; i <= t; ++i) cur[i] = head[i];
    flow += DFS(s, m);
  }
  return flow;
}
bool check(int x) {
  for (int i = s; i <= t; ++i) head[i] = -1;
  tot = 0;
  for (int i = 1; i <= n; ++i) add_edge(s, i, x);
  for (int i = 1; i <= m; ++i) add_edge(n + i, t, 1);
  for (int i = 1; i <= m; ++i) {
    add_edge(U[i], i + n, 1);
    add_edge(V[i], i + n, 1);
  }
  return max_flow() == m;
}
int main() {
  scanf("%d %d", &n, &m);
  s = 0, t = n + m + 1;
  for (int i = 1; i <= m; ++i) scanf("%d %d", &U[i], &V[i]);
  int l = 1, r = m, mid, ans = m;
  while (l <= r) {
    mid = (l + r) >> 1;
    if (check(mid))
      r = mid - 1, ans = mid;
    else
      l = mid + 1;
  }
  printf("%d\n", ans);
  check(ans);
  int T = 2 * n + 2 * m;
  for (int i = 0; i < m; ++i) {
    if (e[i * 4 + T].val)
      printf("%d %d\n", V[i + 1], U[i + 1]);
    else
      printf("%d %d\n", U[i + 1], V[i + 1]);
  }
  return 0;
}
