#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const int MAX = 2e9 + 7;
const long long MOD = 1e9 + 7;
vector<int> g[400010];
bool used[400010];
int timer, tin[400010], fup[400010];
map<pair<int, int>, int> mpi;
map<pair<int, int>, bool> pl;
vector<pair<int, int> > ans;
int cnt = 0, mx = 0;
int n, m;
void dfs(int v, int p = -1) {
  used[v] = true;
  tin[v] = timer++;
  fup[v] = tin[v];
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i];
    if (to == p) continue;
    if (used[to]) {
      fup[v] = min(fup[v], tin[to]);
    } else {
      dfs(to, v);
      fup[v] = min(fup[v], fup[to]);
      if (fup[to] > tin[v]) {
        mpi[make_pair(v, to)] = 1;
        mpi[make_pair(to, v)] = 1;
      }
    }
  }
}
void dfs2(int v) {
  used[v] = true;
  cnt++;
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i];
    if (!mpi[make_pair(v, to)]) {
      mpi[make_pair(v, to)] = 2;
      mpi[make_pair(to, v)] = 2;
      pl[make_pair(v, to)] = true;
      if (!used[to]) {
        dfs2(to);
      }
    }
  }
}
void dfs3(int v) {
  used[v] = true;
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i];
    if (mpi[make_pair(v, to)] == 1) {
      pl[make_pair(to, v)] = true;
      mpi[make_pair(v, to)] = 2;
      mpi[make_pair(to, v)] = 2;
    }
    if (!used[to]) {
      dfs3(to);
    }
  }
}
void find_bridges() {
  timer = 0;
  for (int i = 0; i < n; i++) {
    used[i] = false;
  }
  for (int i = 0; i < n; i++) {
    if (!used[i]) {
      dfs(i);
    }
  }
}
void solve(int qq) {
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
    ans.push_back(make_pair(u, v));
  }
  find_bridges();
  for (int i = 0; i < 400010; i++) {
    used[i] = false;
  }
  int start;
  for (int i = 1; i <= n; i++) {
    if (!used[i]) {
      dfs2(i);
      if (cnt > mx) {
        mx = cnt;
        start = i;
      }
    }
    cnt = 0;
  }
  for (int i = 0; i < 400010; i++) {
    used[i] = false;
  }
  cout << mx << endl;
  dfs3(start);
  for (int i = 0; i < ans.size(); i++) {
    int u = ans[i].first;
    int v = ans[i].second;
    if (pl[make_pair(u, v)])
      cout << u << " " << v << endl;
    else
      cout << v << " " << u << endl;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t;
  t = 1;
  solve(1);
  return 0;
}
