#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int N = 4e5 + 4;
int e[N], uu[N], vv[N];
vector<int> v[N];
int other(int edge, int node) { return uu[edge] ^ vv[edge] ^ node; }
int visit[N], dis[N], tim, is_bridge[N];
vector<pair<int, int>> edges;
int sz[N], par[N];
int find(int x) {
  if (par[x] == x) return x;
  return par[x] = find(par[x]);
}
void merge(int a, int b) {
  int pa = find(a), push_back = find(b);
  if (pa == push_back) return;
  sz[push_back] += sz[pa];
  par[pa] = push_back;
}
int dfs_util(int node, int pe) {
  visit[node] = 1;
  dis[node] = tim++;
  int low = dis[node];
  for (int e : v[node])
    if (e != pe) {
      int it = other(e, node);
      if (!visit[it]) {
        low = min(low, dfs_util(it, e));
        if (edges[e].first != node) swap(edges[e].first, edges[e].second);
      } else if (e != pe) {
        if (dis[it] < dis[node]) {
          low = min(low, dis[it]);
          if (edges[e].first != node) swap(edges[e].first, edges[e].second);
        }
      }
    }
  if (pe != -1) {
    if (dis[node] == low)
      is_bridge[pe] = 1;
    else
      merge(uu[pe], vv[pe]);
  }
  return low;
}
vector<pair<int, int>> tree[N];
int n, m;
void dfs(int node, int par) {
  for (auto it : tree[node]) {
    int x = it.first, e = it.second;
    if (x == par) continue;
    assert(e != -1);
    int p = uu[e], q = vv[e];
    if (find(p) != node) swap(p, q);
    if (edges[e].first != q) swap(edges[e].first, edges[e].second);
    dfs(x, node);
  }
}
void bridge_tree() {
  iota(par, par + N, 0);
  fill(sz, sz + N, 1);
  dfs_util(1, -1);
  int root = -1, mx = -1;
  for (int i = 1; i < n + 1; i++) {
    int node = find(i);
    if (sz[node] > mx) mx = sz[node], root = node;
  }
  for (int i = 0; i < m; i++)
    if (is_bridge[i]) {
      int x = find(uu[i]), y = find(vv[i]);
      tree[x].emplace_back(y, i);
      tree[y].emplace_back(x, i);
    }
  dfs(root, -1);
  printf("%d\n", mx);
  for (int i = 0; i < m; i++) {
    printf("%d %d\n", edges[i].first, edges[i].second);
  }
}
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d", &x);
    scanf("%d", &y);
    uu[i] = x;
    vv[i] = y;
    v[x].push_back(i);
    v[y].push_back(i);
    edges.emplace_back(x, y);
  }
  bridge_tree();
  return 0;
}
