#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l, int r) { return l + rng() % (r - l + 1); }
const int N = 4e5 + 10;
int n, m, x, y, scc, low[N], num[N], it, bri[N], sl[N], id[N];
vector<pair<int, int> > ke[N], ad[N];
pair<int, int> e[N];
void dfs(int u, int pr) {
  low[u] = num[u] = ++it;
  for (auto& v : ke[u])
    if (v.first != pr) {
      if (!num[v.first]) {
        dfs(v.first, u);
        low[u] = min(low[u], low[v.first]);
        if (low[v.first] > num[u]) bri[v.second] = 1;
      } else
        low[u] = min(low[u], num[v.first]);
    }
}
void comp(int u, int c) {
  id[u] = c;
  sl[c]++;
  for (auto& v : ke[u])
    if (!bri[v.second]) {
      if (!id[v.first]) {
        if (e[v.second].first == v.first)
          swap(e[v.second].first, e[v.second].second);
        comp(v.first, c);
      } else if (id[v.first] == c) {
        if (e[v.second].first == u) swap(e[v.second].first, e[v.second].second);
      }
    }
}
void bfs(int u) {
  queue<int> q;
  q.push(u);
  vector<int> d(N, 1e9);
  d[u] = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (auto& v : ad[u])
      if (d[v.first] > d[u] + 1) {
        if (id[e[v.second].first] == u)
          swap(e[v.second].first, e[v.second].second);
        d[v.first] = d[u] + 1;
        q.push(v.first);
      }
  }
}
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y;
    cin >> x >> y;
    ke[x].push_back({y, i}), ke[y].push_back({x, i});
    e[i] = {x, y};
  }
  for (int i = 1; i <= n; i++)
    if (!num[i]) dfs(i, 0);
  int c = 1;
  for (int i = 1; i <= n; i++)
    if (!id[i]) comp(i, c), ++c;
  int mx = 0, mxnode = 1;
  for (int i = 1; i <= m; i++)
    if (bri[i]) {
      int x = e[i].first, y = e[i].second;
      x = id[x], y = id[y];
      if (mx < sl[x]) mx = sl[x], mxnode = x;
      if (mx < sl[y]) mx = sl[y], mxnode = y;
      ad[x].push_back({y, i});
      ad[y].push_back({x, i});
    }
  cout << sl[mxnode] << "\n";
  bfs(mxnode);
  for (int i = 1; i <= m; i++) {
    cout << e[i].first << " " << e[i].second << "\n";
  }
}
