#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5;
vector<int> g[maxn];
bool used[maxn];
int t = 0, tin[maxn], tup[maxn];
set<pair<int, int> > a;
set<pair<int, int> > b;
void bridges(int v, int p = -1) {
  used[v] = true;
  tin[v] = tup[v] = t++;
  for (int u : g[v]) {
    if (u == p) continue;
    if (used[u])
      tup[v] = min(tup[v], tin[u]);
    else {
      bridges(u, v);
      tup[v] = min(tup[v], tup[u]);
      if (tup[u] > tin[v]) {
        b.insert({u, v});
        b.insert({v, u});
      }
    }
  }
}
int cnt;
bool con[maxn];
void dfs(int v, int p = -1) {
  con[v] = true;
  cnt++;
  for (int u : g[v]) {
    if (u != p && !b.count({v, u})) {
      if (!con[u]) {
        a.insert({v, u});
        dfs(u, v);
      } else if (!a.count({u, v}))
        a.insert({v, u});
    }
  }
}
void fin(int v) {
  used[v] = true;
  for (int u : g[v]) {
    if (!used[u]) {
      if (b.count({v, u})) a.insert({u, v});
      fin(u);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  vector<int> u(m), v(m);
  for (int i = 0; i < m; i++) {
    cin >> u[i] >> v[i];
    u[i]--, v[i]--;
    g[u[i]].push_back(v[i]);
    g[v[i]].push_back(u[i]);
  }
  int mx = 0, rt = 0;
  for (int i = 0; i < n; i++)
    if (!used[i]) bridges(i);
  for (int i = 0; i < n; i++) {
    if (!con[i]) {
      cnt = 0;
      dfs(i);
      if (cnt > mx) mx = cnt, rt = i;
    }
  }
  for (int i = 0; i < n; i++) used[i] = false;
  fin(rt);
  cout << mx << "\n";
  for (int i = 0; i < m; i++) {
    if (!a.count({u[i], v[i]})) swap(u[i], v[i]);
    cout << u[i] + 1 << " " << v[i] + 1 << "\n";
  }
  return 0;
}
