#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, s, t, cnt, mxf, ans;
int h[20005], zd[50005], ed[50005], nxt[50005], vis[20005], inc[20005], pr[20005], vvis[20005];
int qwq[20005];
queue<int> q;
vector<int> qu, qv;
bool uv[10005][10005];
pair<int, int> aans[20005];
void add(int u, int v, int c){
zd[++cnt] = v, ed[cnt] = c, nxt[cnt] = h[u], h[u] = cnt;
zd[++cnt] = u, nxt[cnt] = h[v], h[v] = cnt;
}
void dfs(int u){
if (vvis[u])
return;
vvis[u] = 1;
for (int p = h[u]; p; p = nxt[p]){
int v = zd[p];
qwq[v] = qwq[u] ^ 1;
dfs(v);
}
}
bool bfs(){
memset(vis, 0, sizeof vis);
while (!q.empty())
q.pop();
q.push(s);
vis[s] = 1;
inc[s] = LLONG_MAX;
while (!q.empty()){
int u = q.front();
q.pop();
for (int i = h[u]; i; i = nxt[i])
if (ed[i]){
int v = zd[i];
if (vis[v])
continue;
inc[v] = min(inc[u], ed[i]);
pr[v] = i;
q.push(v);
vis[v] = 1;
if (v == t)
return 1;
}
}
return 0;
}
int dfn[20005], low[20005], col[20005];
stack<int> ss;
void tarjan(int u){
dfn[u] = low[u] = ++cnt;
ss.push(u);
vis[u] = 1;
for (int i = h[u]; i; i = nxt[i]){
int v = zd[i];
if (ed[i] <= 0)
continue;
if (!dfn[v]){
tarjan(v);
low[u] = min(low[u], low[v]);
}else if (vis[v])
low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]){
while (!ss.empty()){
int v = ss.top();
ss.pop();
vis[v] = 0;
col[v] = u;
if (u == v)
break;
}
}
}
void upd(){
int u = t;
while(u != s){
int i = pr[u];
ed[i] -= inc[t];
ed[i ^ 1] += inc[t];
u = zd[i ^ 1];
}
mxf += inc[t];
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m;
s = 0;
t = n + 1;
cnt = 1;
for (int i = 1; i <= m; i++){
int u, v;
cin >> u >> v;
qu.push_back(u);
qv.push_back(v);
uv[u][v] = 1;
add(u, v, 1);
}
for (int i = 1; i <= n; i++)
if (!vvis[i]){
qwq[i] = 0;
dfs(i);
}
for (int i = 1; i <= n; i++){
if (!qwq[i])
add(s, i, 1);
else
add(i, t, 1);
}
while(bfs())
upd();
memset(vis, 0, sizeof vis);
cnt = 0;
for (int i = 0; i <= n; i++)
if (!dfn[i])
tarjan(i);
for (int u = 0; u <= n + 1; u++)
for (int p = h[u]; p; p = nxt[p])
if (!ed[p] && uv[u][zd[p]] && col[u] != col[zd[p]]){
++ans;
aans[ans].first = min(u, zd[p]);
aans[ans].second = max(u, zd[p]);
}
cout << ans << "\n";
sort(aans + 1, aans + 1 + ans);
for (int i = 1; i <= ans; i++)
cout << aans[i].first << " " << aans[i].second << "\n";
return 0;
}