#include <bits/stdc++.h>
typedef struct {
  int x;
  int next;
  int id;
} edge;
typedef struct {
  int x;
  int y;
} road;
road way[400010];
edge e[400010 * 2];
int bz[400010], pd[400010];
int be[400010], u = 0, dfn[400010], r[400010], k = 0, f[400010], stack[400010],
                top = 0, h[400010], tot = 0;
int n, m, ans = 0, ki = 0, tp = 0, nv = 0;
void add_edge(int x, int y, int id) {
  e[++tot].x = y;
  e[tot].next = h[x];
  e[tot].id = id;
  h[x] = tot;
}
void tarjan(int x, int fa) {
  int p;
  dfn[x] = f[x] = ++k;
  stack[++top] = x;
  pd[x] = 1;
  for (p = h[x]; p; p = e[p].next) {
    if (e[p].id != fa) {
      if (!dfn[e[p].x]) {
        bz[e[p].id] = 1;
        tarjan(e[p].x, e[p].id);
        f[x] = (f[x] < f[e[p].x]) ? f[x] : f[e[p].x];
      } else if (pd[e[p].x])
        f[x] = (f[x] < dfn[e[p].x]) ? f[x] : dfn[e[p].x];
    }
  }
  pd[x] = 0;
  r[x] = k;
  if (dfn[x] == f[x]) {
    nv = 1;
    u++;
    while (stack[top] != x) {
      nv++;
      be[stack[top]] = u;
      pd[stack[top--]] = 0;
    }
    be[x] = u;
    top--;
    if (nv > ans) {
      ans = nv;
      ki = u;
      tp = dfn[x];
    }
  }
}
int main() {
  int i, x, y, t;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    way[i].x = x;
    way[i].y = y;
    add_edge(x, y, i);
    add_edge(y, x, i);
  }
  for (i = 1; i <= n; i++)
    if (!dfn[i]) tarjan(i, 0);
  printf("%d\n", ans);
  for (i = 1; i <= m; i++) {
    x = way[i].x;
    y = way[i].y;
    if (dfn[x] > dfn[y]) {
      t = x;
      x = way[i].x = way[i].y;
      y = way[i].y = t;
    }
    if (be[x] == be[y] && be[x] == ki) {
      if (bz[i])
        printf("%d %d\n", x, y);
      else
        printf("%d %d\n", y, x);
    } else {
      if (dfn[y] <= tp && tp <= r[y])
        printf("%d %d\n", x, y);
      else
        printf("%d %d\n", y, x);
    }
  }
  return 0;
}
