#include <bits/stdc++.h>
using namespace std;
int n, m, cnt, root, lim, u[400000 + 9], v[400000 + 9];
int s[400000 + 9], z[400000 + 9], fa[400000 + 9], low[400000 + 9],
    dfn[400000 + 9];
set<int> lnk[400000 + 9], rnk[400000 + 9];
int vis[400000 + 9];
inline int find(int e) { return s[e] == e ? e : s[e] = find(s[e]); }
inline void join(int a, int b) {
  z[b] += z[a];
  s[a] = b;
}
void dfs(int f, int u) {
  low[u] = dfn[u] = ++cnt;
  for (auto &&v : lnk[u]) {
    if (v == f) continue;
    if (dfn[v]) {
      low[u] = min(low[u], dfn[v]);
    } else {
      dfs(u, v);
      low[u] = min(low[u], low[v]);
      if (low[v] <= dfn[u]) join(find(u), find(v));
    }
  }
}
void dps(int f, int u) {
  vis[u] = -1;
  if (f) lnk[u].erase(f);
  vector<int> tmp;
  for (auto &&v : lnk[u]) {
    if (find(v) != find(u)) continue;
    if (vis[v] == +1) tmp.push_back(v);
    if (v != f && !vis[v]) dps(u, v);
  }
  for (auto &&v : tmp) lnk[u].erase(v);
  vis[u] = +1;
}
void hfs(int f, int u) {
  fa[u] = f;
  for (auto &&v : rnk[u])
    if (v != f) hfs(u, v);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    s[i] = i;
    z[i] = 1;
  }
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", u + i, v + i);
    lnk[u[i]].insert(v[i]);
    lnk[v[i]].insert(u[i]);
  }
  dfs(0, 1);
  for (int u = 1; u <= n; ++u)
    for (auto &&v : lnk[u]) {
      if (find(u) == find(v)) continue;
      rnk[find(u)].insert(find(v));
      rnk[find(v)].insert(find(u));
    }
  lim = 0;
  for (int u = 1; u <= n; ++u)
    if (find(u) == u) {
      dps(0, u);
      if (lim < z[u]) {
        lim = z[u];
        root = u;
      }
    }
  hfs(0, root);
  printf("%d\n", lim);
  for (int i = 1; i <= m; ++i) {
    int x = find(u[i]), y = find(v[i]);
    if (x == y) {
      if (lnk[v[i]].count(u[i])) swap(u[i], v[i]);
    } else {
      if (fa[y] == x) swap(u[i], v[i]);
    }
    printf("%d %d\n", u[i], v[i]);
  }
  return 0;
}
