#include <bits/stdc++.h>
using namespace std;
bool vis[500005];
int low[500005], d[500005], par[500005], rnk[500005], lev[500005], timer;
vector<int> adj[500005], tree[500005];
vector<pair<int, int>> edges;
map<int, map<int, int>> ed, br;
int get(int x) { return (par[x] == x ? x : par[x] = get(par[x])); }
void link(int x, int y) {
  x = get(x);
  y = get(y);
  if (x == y) return;
  par[x] = y;
}
void bridge_find(int u, int par) {
  timer++;
  d[u] = low[u] = timer;
  for (auto x : adj[u]) {
    if (x == par) continue;
    if (d[x] > 0) {
      low[u] = min(low[u], d[x]);
      if (ed[x][u] == 0) ed[u][x] = 1;
    } else {
      bridge_find(x, u);
      low[u] = min(low[u], low[x]);
      if (d[u] < low[x])
        br[u][x] = 1, br[x][u] = 1;
      else {
        ed[u][x] = 1;
        link(u, x);
      }
    }
  }
}
void dfs(int child, int par) {
  vis[child] = 1;
  for (auto x : adj[child]) {
    if (x == par) continue;
    if (br[x][child]) ed[x][child] = 1;
    if (!vis[x]) dfs(x, child);
  }
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) rnk[i] = 1, par[i] = i;
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    edges.push_back({x, y});
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  bridge_find(1, -1);
  int mx = 0, cur;
  for (int i = 1; i <= n; i++) {
    int x;
    x = get(i);
    lev[x]++;
    if (mx < lev[x]) {
      mx = lev[x], cur = x;
    }
  }
  dfs(cur, -1);
  cout << mx << endl;
  for (int i = 0; i < m; i++) {
    if (ed[edges[i].first][edges[i].second])
      cout << edges[i].first << " " << edges[i].second << endl;
    else if (ed[edges[i].second][edges[i].first])
      cout << edges[i].second << " " << edges[i].first << endl;
  }
}
