1 // CF 732F Tourist Reform
2 // 思路:两遍tarjan
3 // 找强联通分量
4 #include <bits/stdc++.h>
5 using namespace std;
6 #define LL long long
7 typedef pair<int,int> pii;
8 const int inf = 0x3f3f3f3f;
9 const int N =41e5+10;
10 #define clc(a,b) memset(a,b,sizeof(a))
11 const double eps = 1e-8;
12 const int MOD = 1e9+7;
13 void fre() {freopen("in.txt","r",stdin);}
14 void freout() {freopen("out.txt","w",stdout);}
15 inline int read() {int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
16
17 int head[N],low[N],dfn[N],s[N];
18 int cnt,tot;
19 struct Edge{
20 int v,w,nt;
21 Edge(){}
22 Edge(int v_,int w_,int nt_):v(v_),w(w_),nt(nt_){}
23 }e[N<<1];
24
25 void add(int u,int v,int w){
26 e[cnt]=Edge(v,w,head[u]);
27 head[u]=cnt++;
28 }
29 pii mat[N];
30 int rt;
31 int ans;
32 void tarjan(int u,int f){
33 low[u] = dfn[u] = ++ tot;
34 s[++s[0]] = u;
35 for(int i = head[u]; i != -1; i = e[i].nt) {
36 int v = e[i].v;
37 if(v == f) continue;
38 if(!dfn[v]) {
39 mat[e[i].w] = make_pair(v, u);
40 tarjan(v, u);
41 low[u] = min(low[u], low[v]);
42 }
43 else {
44 mat[e[i].w] = make_pair(u, v);
45 low[u] = min(low[u], dfn[v]);
46 }
47 }
48 if(dfn[u] == low[u]) {
49 int res = 1;
50 while(s[s[0]] != u) {
51 ++ res;
52 -- s[0];
53 }
54 -- s[0];
55 if(ans < res) {ans = res; rt = u;}
56 }
57 }
58
59 void init(){
60 clc(head,-1);
61 tot=0;
62 cnt=0;
63 ans=0;
64 }
65 int main(){
66 init();
67 int n,m;
68 scanf("%d%d",&n,&m);
69 for(int i=1;i<=m;i++){
70 int u,v;
71 scanf("%d%d",&u,&v);
72 add(u,v,i);
73 add(v,u,i);
74 }
75 s[0]=0;
76 tarjan(1,-1);
77 clc(dfn,0);
78 tot=0;
79 s[0]=0;
80 tarjan(rt,-1);
81 printf("%d\n",ans);
82 for(int i=1;i<=m;i++){
83 printf("%d %d\n",mat[i].first,mat[i].second);
84 }
85 return 0;
86 }