#include <bits/stdc++.h>
using namespace std;
int n, m, k, mo, db;
vector<vector<pair<int, int> > > sor;
vector<int> eleres, legfelso, osszefuggokomponensdarabszam, erintettuk, apa;
vector<bool> volt;
vector<vector<pair<int, int> > > hidelek;
vector<pair<int, int> > utak;
vector<pair<int, pair<int, int> > > vegsomo;
bool nagyobb(pair<int, int> a, pair<int, int> b) {
  if (a.first > b.first) return true;
  if (a.first == b.first && a.second > b.second) return true;
  return false;
}
bool tartalmaz(int a, int b, int hanyadik) {
  if (hidelek[a].size() == 0) return false;
  int l = 0, r = hidelek[a].size() - 1;
  while (l != r) {
    int koztes = (l + r + 1) / 2;
    if (nagyobb(hidelek[a][koztes], {hanyadik, b}))
      r = koztes - 1;
    else
      l = koztes;
  }
  if (hidelek[a][l].first == hanyadik && hidelek[a][l].second == b)
    return true;
  else
    return false;
}
void bejaras(int hely, int szulo) {
  apa[hely] = szulo;
  volt[hely] = true;
  eleres[hely] = k;
  legfelso[hely] = k;
  k++;
  for (pair<int, int> x : sor[hely]) {
    if (x.second == szulo) continue;
    if (volt[x.second] == false) {
      bejaras(x.second, hely);
      legfelso[hely] = min(legfelso[hely], legfelso[x.second]);
      if (eleres[hely] < legfelso[x.second]) {
        hidelek[hely].push_back(make_pair(x.first, x.second));
        hidelek[x.second].push_back(make_pair(x.first, hely));
      }
    } else {
      legfelso[hely] = min(legfelso[hely], eleres[x.second]);
    }
  }
}
void dfs(int hely) {
  erintettuk.push_back(hely);
  db++;
  volt[hely] = true;
  for (pair<int, int> x : sor[hely]) {
    if (tartalmaz(hely, x.second, x.first) == false && volt[x.second] == false)
      dfs(x.second);
  }
}
void osszefuggokomponensekrendezese(int hely, int szulo) {
  volt[hely] = true;
  k++;
  eleres[hely] = k;
  for (pair<int, int> x : sor[hely]) {
    if (x.second == szulo) continue;
    if (volt[x.second] == false) {
      vegsomo.push_back(make_pair(x.first, make_pair(x.second, hely)));
      osszefuggokomponensekrendezese(x.second, hely);
    } else {
      if (eleres[hely] > eleres[x.second])
        vegsomo.push_back(make_pair(x.first, make_pair(x.second, hely)));
    }
  }
}
int main() {
  cin >> n >> m;
  k = 1, mo = 0, db = 0;
  sor.assign(n, vector<pair<int, int> >(0));
  eleres.assign(n, 0);
  legfelso.assign(n, 0);
  volt.assign(n, false);
  hidelek.assign(n, vector<pair<int, int> >(0));
  osszefuggokomponensdarabszam.assign(n, -1);
  erintettuk.assign(0, 0);
  apa.assign(n, -1);
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    utak.push_back(make_pair(u, v));
    sor[u].push_back({i, v});
    sor[v].push_back({i, u});
  }
  bejaras(0, -1);
  for (int i = 0; i < n; i++) {
    sort(hidelek[i].begin(), hidelek[i].end());
  }
  for (int i = 0; i < n; i++) {
    sort(sor[i].begin(), sor[i].end());
  }
  volt.assign(n, false);
  for (int i = 0; i < n; i++) {
    if (volt[i] == true) continue;
    db = 0;
    erintettuk.assign(0, 0);
    dfs(i);
    for (int x : erintettuk) osszefuggokomponensdarabszam[x] = db;
  }
  for (int x : osszefuggokomponensdarabszam) mo = max(mo, x);
  cout << mo << endl;
  int index;
  for (int i = 0; i < n; i++) {
    if (osszefuggokomponensdarabszam[i] == mo) {
      index = i;
      break;
    }
  }
  volt.assign(n, false);
  k = 0;
  eleres.assign(n, -1);
  osszefuggokomponensekrendezese(index, -1);
  sort(vegsomo.begin(), vegsomo.end());
  for (int i = 0; i < vegsomo.size(); i++) {
    if (i == 0)
      cout << vegsomo[i].second.first + 1 << " " << vegsomo[i].second.second + 1
           << endl;
    if (i != 0)
      if (vegsomo[i].second != vegsomo[i - 1].second)
        cout << vegsomo[i].second.first + 1 << " "
             << vegsomo[i].second.second + 1 << endl;
  }
  return 0;
}
