#include <bits/stdc++.h>
using namespace std;
const int NMAX = 400050;
vector<int> g[NMAX];
int tin[NMAX];
bool used[NMAX];
int T = 1;
int dp[NMAX], size[NMAX], parent[NMAX];
bool bad[NMAX];
set<pair<int, int> > ans;
void dfs(int v, int p) {
  used[v] = 1;
  size[v] = 1;
  parent[v] = p;
  tin[v] = T++;
  dp[v] = T;
  for (auto t : g[v]) {
    if (t == p) continue;
    if (used[t]) {
      dp[v] = min(dp[v], tin[t]);
    } else {
      dfs(t, v);
      dp[v] = min(dp[v], dp[t]);
      if (tin[v] >= dp[t]) {
        size[v] += size[t];
      }
    }
  }
}
void dfs_ans(int v, int p) {
  used[v] = 1;
  tin[v] = T++;
  dp[v] = T;
  for (auto t : g[v]) {
    if (t == p) continue;
    if (used[t]) {
      dp[v] = min(dp[v], tin[t]);
      if (ans.find({t + 1, v + 1}) == ans.end()) ans.insert({v + 1, t + 1});
    } else {
      dfs_ans(t, v);
      dp[v] = min(dp[v], dp[t]);
      if (tin[v] < dp[t]) {
        ans.insert({t + 1, v + 1});
      } else {
        ans.insert({v + 1, t + 1});
      }
    }
  }
}
int main() {
  srand((unsigned int)time(NULL));
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m;
  cin >> n >> m;
  vector<pair<int, int> > v((unsigned long)m);
  for (int i = 0; i < m; i++) {
    cin >> v[i].first >> v[i].second;
    v[i].first--, v[i].second--;
    g[v[i].first].push_back(v[i].second);
    g[v[i].second].push_back(v[i].first);
  }
  dfs(0, -1);
  int maxx = 0;
  for (int i = 0; i < n; i++) {
    maxx = max(maxx, size[i]);
  }
  memset(used, 0, sizeof(used));
  int kor = -1;
  for (int i = 0; i < n; i++) {
    if (size[i] == maxx) {
      kor = i;
      break;
    }
  }
  fill(used, used + NMAX, 0);
  fill(dp, dp + NMAX, 0);
  fill(tin, tin + NMAX, 0);
  T = 1;
  dfs_ans(kor, -1);
  cout << maxx << '\n';
  for (int i = 0; i < m; i++) {
    v[i].first++, v[i].second++;
    if (ans.find({v[i].first, v[i].second}) != ans.end()) {
      cout << v[i].first << ' ' << v[i].second << '\n';
    } else if (ans.find({v[i].second, v[i].first}) != ans.end()) {
      cout << v[i].second << ' ' << v[i].first << '\n';
    } else {
      assert(false);
    }
  }
}
