#include <bits/stdc++.h>
using namespace std;
int n, m, head[400005], cnt = 0, df, dfn[400005], compcnt, low[400005],
                        comphead[400005], que[400005], qcnt, compsize[400005];
bool inque[400005], vis[400005], incomp[400005];
int ba[400005], bq[400005], res[400005], q, oow = (1 << 30) - 2;
struct edges {
  int next, to, fr;
} e[4 * 400005];
void tarjan(int k, int f) {
  que[++qcnt] = k;
  inque[k] = 1;
  dfn[k] = ++df;
  low[k] = min(low[k], dfn[k]);
  for (int i = head[k]; i; i = e[i].next) {
    if (e[i].to == f) continue;
    if (i % 2 == 0)
      q = i - 1;
    else
      q = i;
    q = q >> 1;
    q++;
    if (res[q] < 0) res[q] = ~i & 1;
    if (!dfn[e[i].to]) {
      tarjan(e[i].to, k);
      low[k] = min(low[k], low[e[i].to]);
    } else {
      if (inque[e[i].to]) low[k] = min(low[k], dfn[e[i].to]);
    }
  }
  if (dfn[k] == low[k]) {
    compcnt++;
    while (que[qcnt] != k) {
      inque[e[cnt].to] = 0;
      cnt++;
      e[cnt].next = comphead[compcnt];
      comphead[compcnt] = cnt;
      e[cnt].to = que[qcnt--];
      compsize[compcnt]++;
    }
    inque[e[cnt].to] = 0;
    cnt++;
    e[cnt].next = comphead[compcnt];
    comphead[compcnt] = cnt;
    e[cnt].to = que[qcnt--];
    compsize[compcnt]++;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  int a, b;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &a, &b);
    e[++cnt].to = b;
    e[cnt].next = head[a];
    head[a] = cnt;
    e[cnt].fr = a;
    e[++cnt].to = a;
    e[cnt].next = head[b];
    head[b] = cnt;
    e[cnt].fr = b;
  }
  for (int i = 1; i <= n; i++) low[i] = n + 1;
  tarjan(1, 0);
  int maxcomp = 0, maxcompsize = 0;
  for (int i = 1; i <= compcnt; i++) {
    if (compsize[i] > maxcompsize) {
      maxcompsize = compsize[i];
      maxcomp = i;
    }
  }
  printf("%d\n", maxcompsize);
  memset(dfn, 0, sizeof(dfn));
  memset(inque, 0, sizeof(inque));
  memset(res, -1, sizeof(res));
  df = 0;
  qcnt = 0;
  compcnt = 0;
  tarjan(e[comphead[maxcomp]].to, 0);
  for (int i = 1; i <= m; i++) {
    if (res[i])
      printf("%d %d\n", e[i * 2 - 1].fr, e[i * 2 - 1].to);
    else
      printf("%d %d\n", e[i * 2 - 1].to, e[i * 2 - 1].fr);
  }
  return 0;
}
