#include <bits/stdc++.h>
using namespace std;
template <class T>
T sqr(T x) {
  return x * x;
}
const int maxn = 500001;
vector<pair<int, int> > E[maxn];
int dfn[maxn], low[maxn];
pair<int, int> e[maxn];
vector<int> lk[maxn], ban[maxn], ans_list[maxn];
int n, x, y, u, v, sz, col, m;
int mp[maxn];
void tarjan(int now, int cnt) {
  dfn[now] = low[now] = cnt;
  for (int ii = E[now].size() - 1; ii >= 0; --ii) {
    int i = E[now][ii].first;
    if (!dfn[i]) {
      tarjan(i, cnt + 1);
      low[now] = min(low[now], low[i]);
      if (low[i] > dfn[now]) {
        ban[now][ii] = 1;
        int jj = E[now][ii].second;
        ban[i][jj] = 1;
      }
    } else if (dfn[i] != dfn[now] - 1)
      low[now] = min(low[now], dfn[i]);
  }
}
void dfs(int k) {
  sz++;
  for (int i = 0; i < E[k].size(); i++) {
    int v = E[k][i].first;
    if (ban[k][i]) continue;
    if (dfn[v]) continue;
    dfn[v] = dfn[k];
    dfs(v);
  }
}
void fin_dfs(int k) {
  int flag = 1;
  for (int i = 0; i < E[k].size(); i++) {
    int v = E[k][i].first;
    int j = E[k][i].second;
    if (lk[k][i]) continue;
    if (dfn[v] == dfn[k]) {
      lk[k][i] = 1;
      lk[v][j] = 1;
      ans_list[k][i] = v;
      ans_list[v][j] = v;
      fin_dfs(v);
    } else {
      lk[k][i] = 1;
      lk[v][j] = 1;
      ans_list[k][i] = v;
      ans_list[v][j] = v;
      fin_dfs(v);
    }
  }
}
inline void biu(int &x) {
  lk[x].push_back(0);
  ban[x].push_back(0);
  ans_list[x].push_back(0);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    int s1 = E[y].size();
    int s2 = E[x].size();
    E[x].push_back(pair<int, int>(y, s1));
    E[y].push_back(pair<int, int>(x, s2));
    biu(x);
    biu(y);
    e[i] = pair<int, int>(x, y);
    mp[i] = s2;
  }
  tarjan(1, 1);
  memset(dfn, 0, sizeof(dfn));
  int max_sz = 0;
  int ans = 0;
  for (int i = 1; i <= n; i++)
    if (!dfn[i]) {
      sz = 0;
      dfn[i] = ++col;
      dfs(i);
      if (sz > max_sz) ans = col, max_sz = sz;
    }
  for (int i = 1; i <= n; i++)
    if (dfn[i] == ans) {
      fin_dfs(i);
      break;
    }
  printf("%d\n", max_sz);
  for (int i = 1; i <= m; i++) {
    int x = e[i].first;
    int y = e[i].second;
    int xx = ans_list[x][mp[i]];
    int yy = x + y - xx;
    printf("%d %d\n", xx, yy);
  }
}
