#include <bits/stdc++.h>
using namespace std;
map<pair<int, int>, int> edges;
vector<int> v[400009], tree[400009];
int low[400009], timer[400009], t = 0, c = 0, color[400009];
int vis[400009];
bool rev[400009];
pair<int, int> edges2[400009];
int elem = 0;
int max_color = 0;
int num_color[400009];
set<pair<int, int> > bridges;
void mini(int &a, int b) { a = min(a, b); }
void dfs(int node, int parent) {
  vis[node] = 1;
  low[node] = timer[node] = t++;
  for (int child : v[node]) {
    if (child == parent) continue;
    if (vis[child] == 1) {
      mini(low[node], timer[child]);
      tree[node].push_back(child);
      if (edges.count(make_pair(child, node))) {
        rev[edges[make_pair(child, node)]] = 1;
      }
    } else if (vis[child] == 0) {
      dfs(child, node);
      mini(low[node], low[child]);
      if (low[child] > timer[node]) {
        tree[child].push_back(node);
        tree[node].push_back(child);
        bridges.insert(make_pair(node, child));
      } else {
        tree[node].push_back(child);
        if (edges.count(make_pair(child, node))) {
          rev[edges[make_pair(child, node)]] = 1;
        }
      }
    }
  }
  vis[node] = 2;
}
void dfs_(int node) {
  vis[node] = true;
  for (int child : tree[node]) {
    if (!vis[child]) {
      if (bridges.count(make_pair(child, node)) ||
          bridges.count(make_pair(node, child))) {
        color[child] = ++c;
        num_color[color[child]]++;
      } else {
        color[child] = color[node];
        num_color[color[child]]++;
      }
      dfs_(child);
    }
  }
}
void dfs__(int node) {
  vis[node] = 1;
  for (int child : tree[node]) {
    if (!vis[child]) {
      if (bridges.count(make_pair(child, node)) ||
          bridges.count(make_pair(node, child))) {
        if (edges.count(make_pair(node, child))) {
          rev[edges[make_pair(node, child)]] = 1;
        }
      }
      dfs__(child);
    }
  }
}
int main() {
  memset(rev, 0, sizeof rev);
  int n, m;
  cin >> n >> m;
  for (int i = (0); i < (m); i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    v[a].push_back(b);
    v[b].push_back(a);
    edges[make_pair(a, b)] = i;
    edges2[i] = make_pair(a, b);
  }
  memset(vis, 0, sizeof vis);
  dfs(0, -1);
  memset(num_color, 0, sizeof num_color);
  num_color[0] = 1;
  color[0] = 0;
  memset(vis, 0, sizeof vis);
  for (int i = (0); i < (n); i++) {
    if (!vis[i]) {
      dfs_(i);
    }
  }
  int obj;
  max_color = 0;
  for (int i = (0); i < (n); i++) {
    if (num_color[color[i]] > max_color) {
      max_color = num_color[color[i]];
      obj = i;
    }
  }
  memset(vis, 0, sizeof vis);
  dfs__(obj);
  cout << max_color << endl;
  for (int i = (0); i < (m); i++) {
    if (rev[i]) {
      cout << edges2[i].second + 1 << " " << edges2[i].first + 1 << endl;
    } else {
      cout << edges2[i].first + 1 << " " << edges2[i].second + 1 << endl;
    }
  }
  return 0;
}
