#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long double pi = acos(-1);
const int MOD = 1e9 + 7;
int n, m;
const int N = 400100;
vector<int> graph[N], graph2[N];
pair<int, int> ed[N];
int dfs_low[N], dfs_prof[N], us[N], comp[N];
int tempo = 0;
set<pair<int, int> > pontes;
vector<pair<int, int> > resp;
void dfs(int u, int pai) {
  us[u] = 1;
  int nf = 0;
  dfs_low[u] = dfs_prof[u] = tempo++;
  for (int v : graph[u]) {
    if (!us[v]) {
      dfs(v, u);
      nf++;
      if (dfs_low[v] > dfs_prof[u]) {
        pontes.insert(make_pair(u, v));
        pontes.insert(make_pair(v, u));
      }
      dfs_low[u] = min(dfs_low[u], dfs_low[v]);
    } else if (v != pai)
      dfs_low[u] = min(dfs_low[u], dfs_prof[v]);
  }
}
void dfs2(int u, int col, int last) {
  comp[u] = col;
  us[u] = 1;
  for (int v : graph2[u]) {
    if (us[v] != 2 and v != last) {
      resp.push_back(make_pair(u, v));
    }
    if (!comp[v]) dfs2(v, col, u);
  }
  us[u] = 2;
}
void dfs3(int u) {
  us[u] = 1;
  for (int v : graph[u]) {
    if (comp[u] != comp[v] and !us[v]) {
      resp.push_back(make_pair(v, u));
      dfs3(v);
    } else if (!us[v]) {
      dfs3(v);
    }
  }
}
int main() {
  map<pair<int, int>, int> mapa;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    ed[i] = make_pair(u, v);
    graph[u].push_back(v);
    graph[v].push_back(u);
    mapa[make_pair(u, v)] = i;
    mapa[make_pair(v, u)] = i;
  }
  for (int i = 1; i <= n; i++)
    if (!us[i]) dfs(i, -1);
  for (int i = 0; i < m; i++) {
    pair<int, int> x = ed[i];
    if (pontes.count(x)) {
      continue;
    }
    graph2[x.first].push_back(x.second);
    graph2[x.second].push_back(x.first);
  }
  int col = 1;
  memset(us, 0, sizeof(us));
  for (int i = 1; i <= n; i++) {
    if (!comp[i]) dfs2(i, col++, i);
  }
  vector<int> cores(col, 0);
  int idx = 0, maximo = 0;
  ;
  for (int i = 1; i <= n; i++) {
    cores[comp[i]]++;
    if (cores[comp[i]] > maximo) maximo = cores[comp[i]], idx = i;
  }
  memset(us, 0, sizeof(us));
  dfs3(idx);
  cout << maximo << "\n";
  vector<pair<int, int> > r(resp.size());
  for (auto it : resp) {
    r[mapa[it]] = it;
  }
  for (auto it : r) {
    printf("%d ", it.first);
    printf("%d\n", it.second);
  }
  return 0;
}
