#include <bits/stdc++.h>
const int INF = 1e9 + 7;
const long long INFLL = 1e16;
const double EPS = 1e-6;
using namespace std;
const int maxn = 4e5 + 5;
int par[maxn], sz[maxn];
int root(int a) {
  if (par[a] == a) return a;
  return par[a] = root(par[a]);
}
void join(int a, int b) {
  a = root(a);
  b = root(b);
  if (a == b) return;
  par[a] = b;
  sz[b] += sz[a];
}
int n, m;
vector<pair<int, int> > adj[maxn];
int num[maxn], rev[maxn], ori[maxn], hit = 1;
int flag[maxn];
pair<int, int> ret[maxn];
int dfs(int a) {
  if (num[a]) return num[a];
  num[a] = hit;
  ori[a] = hit;
  rev[hit++] = a;
  for (int k = (int)0; k < (int)adj[a].size(); k++) {
    int b = adj[a][k].first;
    int id = adj[a][k].second;
    if (!flag[id]) {
      flag[id] = 1;
      ret[id] = make_pair(b, a);
      num[a] = min(num[a], dfs(b));
    }
  }
  return num[a];
}
int main() {
  scanf("%d%d", &n, &m);
  for (int k = (int)0; k < (int)m; k++) {
    int a, b;
    scanf("%d%d", &a, &b);
    adj[a].push_back(make_pair(b, k));
    adj[b].push_back(make_pair(a, k));
  }
  for (int k = (int)0; k < (int)maxn; k++) par[k] = k, sz[k] = 1;
  dfs(1);
  for (int k = (int)1; k < (int)n + 1; k++) {
    if (num[k] < ori[k]) {
      join(rev[num[k]], k);
    }
  }
  pair<int, int> maks = make_pair(-1, 0);
  for (int k = (int)1; k < (int)n + 1; k++) {
    int a = root(k);
    maks = max(maks, make_pair(sz[a], a));
  }
  printf("%d\n", maks.first);
  memset(flag, 0, sizeof(flag));
  memset(num, 0, sizeof(num));
  hit = 1;
  dfs(maks.second);
  for (int k = (int)0; k < (int)m; k++) {
    printf("%d %d\n", ret[k].first, ret[k].second);
  }
  return 0;
}
