#include <bits/stdc++.h>
using namespace std;
template <class T>
T min(T a, T b, T c) {
  return min(a, min(b, c));
}
template <class T>
T max(T a, T b, T c) {
  return max(a, max(b, c));
}
int n, m, low[400005], num[400005], parent[400005], cnt, s, maxCnt = 0;
vector<int> ke[400005];
set<pair<int, int> > bridge;
map<pair<int, int>, int> id;
pair<int, int> ans[400005];
void DFS(int u) {
  num[u] = low[u] = ++cnt;
  for (__typeof(ke[u].begin()) it = ke[u].begin(); it != ke[u].end(); it++) {
    int v = *it;
    if (v == parent[u]) continue;
    if (!num[v]) {
      parent[v] = u;
      DFS(v);
      if (low[v] > num[u]) {
        bridge.insert(make_pair(u, v));
        bridge.insert(make_pair(v, u));
      }
      low[u] = min(low[u], low[v]);
    } else
      low[u] = min(low[u], num[v]);
  }
}
void DFS1(int u) {
  num[u] = 1;
  ++cnt;
  for (__typeof(ke[u].begin()) it = ke[u].begin(); it != ke[u].end(); it++) {
    int v = *it;
    if (!num[v] && !bridge.count(make_pair(u, v))) DFS1(v);
  }
}
void DFS2(int u) {
  num[u] = 1;
  for (__typeof(ke[u].begin()) it = ke[u].begin(); it != ke[u].end(); it++) {
    int v = *it;
    if (v == parent[u]) continue;
    int i = id[make_pair(u, v)];
    if (ans[i] == make_pair(0, 0))
      ans[i] =
          (bridge.count(make_pair(u, v))) ? make_pair(v, u) : make_pair(u, v);
    if (!num[v]) {
      parent[v] = u;
      DFS2(v);
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (1); i <= (m); ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    ke[u].push_back(v);
    ke[v].push_back(u);
    id[make_pair(u, v)] = id[make_pair(v, u)] = i;
  }
  DFS(1);
  memset(num, 0, sizeof num);
  for (int u = (1); u <= (n); ++u) {
    if (!num[u]) {
      cnt = 0;
      DFS1(u);
      if (cnt > maxCnt) {
        maxCnt = cnt;
        s = u;
      }
    }
  }
  memset(num, 0, sizeof num);
  memset(parent, 0, sizeof parent);
  DFS2(s);
  printf("%d\n", maxCnt);
  for (int i = (1); i <= (m); ++i)
    printf("%d %d\n", ans[i].first, ans[i].second);
  return 0;
}
