#include <bits/stdc++.h>
using namespace std;
struct nod {
  int end, next;
  bool cnt;
} g[400005 * 2];
int dfsn[400005], q[400005 * 20], ans[400005 * 2][2], fa[400005], low[400005];
int dex, col, ma, id, tot, n, m, t, a, b, w, C;
bool v[400005];
void add(int a, int b) {
  g[++tot].end = b;
  g[tot].next = fa[a];
  fa[a] = tot;
}
void tarjan(int w, int pre) {
  dfsn[w] = low[w] = ++dex;
  v[w] = 1;
  for (int i = fa[w]; i != -1; i = g[i].next) {
    int u = g[i].end;
    if (u == pre) continue;
    if (!dfsn[u]) {
      tarjan(u, w);
      low[w] = min(low[w], low[u]);
      if (low[u] > dfsn[w]) {
        g[i].cnt = g[i ^ 1].cnt = true;
      }
    } else if (v[u])
      low[w] = min(low[w], dfsn[u]);
  }
}
void dfs(int w) {
  C++;
  dfsn[w] = 1;
  for (int i = fa[w]; i != -1; i = g[i].next) {
    if (g[i].cnt) continue;
    int u = g[i].end;
    ans[i / 2][0] = w;
    ans[i / 2][1] = u;
    if (!dfsn[u]) dfs(u);
  }
}
void bfs(int S) {
  int x;
  memset(v, false, sizeof(v));
  t = 0;
  w = 1;
  q[1] = S;
  v[S] = 1;
  while (t < w) {
    x = q[++t];
    for (int i = fa[x]; i != -1; i = g[i].next) {
      int u = g[i].end;
      if (v[u]) continue;
      if (g[i].cnt) {
        ans[i / 2][0] = u;
        ans[i / 2][1] = x;
      }
      v[u] = 1;
      q[++w] = u;
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  tot = -1;
  memset(fa, -1, sizeof(fa));
  for (int i = 1; i <= m; i++) scanf("%d%d", &a, &b), add(a, b), add(b, a);
  for (int i = 1; i <= n; i++)
    if (!dfsn[i]) tarjan(i, -1);
  memset(dfsn, 0, sizeof(dfsn));
  ma = id = 0;
  for (int i = 1; i <= n; i++) {
    C = 0;
    if (!dfsn[i]) dfs(i);
    if (C > ma) ma = C, id = i;
  }
  printf("%d\n", ma);
  bfs(id);
  for (int i = 0; i < m; i++) printf("%d %d ", ans[i][0], ans[i][1]);
  printf("\n");
  return 0;
}
