#include <bits/stdc++.h>
using namespace std;
const int MAXN = 900000;
const int MAXM = 900000;
struct Edge {
  int f;
  int to, next;
  bool cut;
  bool isShow;
} edge[MAXM];
int head[MAXN], tot;
int Low[MAXN], DFN[MAXN], Stack[MAXN], Belong[MAXN];
int Index, top;
int block;
bool Instack[MAXN];
int bridge;
void addedge(int u, int v) {
  edge[tot].f = u;
  edge[tot].to = v;
  edge[tot].next = head[u];
  edge[tot].cut = false;
  edge[tot].isShow = false;
  head[u] = tot++;
}
void Tarjan(int u, int pre) {
  int v;
  Low[u] = DFN[u] = ++Index;
  Stack[top++] = u;
  Instack[u] = true;
  int pre_cnt = 0;
  for (int i = head[u]; i != -1; i = edge[i].next) {
    v = edge[i].to;
    if (v == pre && pre_cnt == 0) {
      pre_cnt++;
      continue;
    }
    if (!DFN[v]) {
      Tarjan(v, u);
      if (Low[u] > Low[v]) Low[u] = Low[v];
      if (Low[v] > DFN[u]) {
        bridge++;
        edge[i].cut = true;
        edge[i ^ 1].cut = true;
      }
    } else if (Instack[v] && Low[u] > DFN[v])
      Low[u] = DFN[v];
  }
  if (Low[u] == DFN[u]) {
    block++;
    do {
      v = Stack[--top];
      Instack[v] = false;
      Belong[v] = block;
    } while (v != u);
  }
}
void init() {
  tot = 0;
  memset(head, -1, sizeof(head));
}
int sum_belong[MAXN];
int n, m;
int vis[MAXN];
void dfs(int x, int fa) {
  vis[x] = 1;
  for (int i = head[x]; i != -1; i = edge[i].next) {
    int t = edge[i].to;
    if (t == fa) continue;
    if (edge[i].isShow || edge[i ^ 1].isShow) continue;
    if (!edge[i].cut) {
      edge[i].isShow = 1;
    } else {
      edge[i ^ 1].isShow = 1;
    }
    if (vis[t]) continue;
    dfs(t, x);
  }
}
void solve(int n) {
  memset(DFN, 0, sizeof(DFN));
  memset(Instack, false, sizeof(Instack));
  Index = top = block = 0;
  Tarjan(1, 0);
  int maxx = 0;
  for (int i = 1; i <= n; i++) {
    sum_belong[Belong[i]]++;
    maxx = max(maxx, sum_belong[Belong[i]]);
  }
  int root;
  for (int i = 1; i <= n; i++) {
    if (sum_belong[i] == maxx) {
      root = i;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (Belong[i] == root) {
      root = i;
      break;
    }
  }
  dfs(root, -1);
  cout << maxx << endl;
  for (int i = 0; i < m * 2; i++) {
    if (edge[i].isShow) {
      cout << edge[i].f << " " << edge[i].to << "\n";
    }
  }
}
int main() {
  int u, v;
  cin >> n >> m;
  init();
  for (int _ = 0; _ < m; _++) {
    scanf("%d%d", &u, &v);
    addedge(u, v);
    addedge(v, u);
  }
  solve(n);
  return 0;
}
