#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[200002], b[200002];
struct edge {
  int a;
  int b;
  int cap;
  int flow;
};
int s, t;
vector<edge> e;
vector<int> g[200002];
int d[200002], ptr[200002];
void add_edge(int a, int b, int cap) {
  edge e1 = {a, b, cap, 0};
  edge e2 = {b, a, 0, 0};
  g[a].push_back(e.size());
  e.push_back(e1);
  g[b].push_back(e.size());
  e.push_back(e2);
}
bool bfs() {
  queue<int> qu;
  qu.push(s);
  memset(d, -1, sizeof d);
  d[s] = 0;
  while (qu.size()) {
    int u = qu.front();
    qu.pop();
    for (int i = 0; i < g[u].size(); i++) {
      int id = g[u][i];
      int v = e[id].b;
      if (e[id].cap == e[id].flow) continue;
      if (d[v] != -1) continue;
      d[v] = d[u] + 1;
      qu.push(v);
    }
  }
  return (d[t] != -1);
}
int dfs(int u, int flow) {
  if (u == t || flow == 0) return flow;
  for (; ptr[u] < g[u].size(); ptr[u]++) {
    int id = g[u][ptr[u]];
    int v = e[id].b;
    if (d[v] != d[u] + 1) continue;
    int pushed = dfs(v, min(flow, e[id].cap - e[id].flow));
    if (pushed) {
      e[id].flow += pushed;
      e[id ^ 1].flow -= pushed;
      return pushed;
    }
  }
  return 0;
}
int dinic() {
  int flow = 0;
  while (bfs()) {
    memset(ptr, 0, sizeof ptr);
    while (true) {
      int pushed = dfs(s, (int)(1e9));
      if (pushed == 0) break;
      flow += pushed;
    }
  }
  return flow;
}
int solve(int k) {
  e.clear();
  for (int i = 0; i < m + n + 7; i++) g[i].clear();
  for (int i = 1; i <= n; i++) add_edge(0, i, k);
  for (int i = 1; i <= m; i++) {
    add_edge(a[i], i + n, 1);
    add_edge(b[i], i + n, 1);
    add_edge(i + n, n + m + 1, 1);
  }
  s = 0;
  t = n + m + 1;
  return dinic();
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) cin >> a[i] >> b[i];
  int L = 0, R = m, mid;
  while (R - L > 5) {
    mid = (L + R) >> 1;
    if (solve(mid) == m)
      R = mid;
    else
      L = mid + 1;
  }
  int ans = L;
  for (; ans <= R; ans++) {
    if (solve(ans) == m) break;
  }
  for (int i = 0; i < e.size(); i++) {
    if (e[i].a >= 1 && e[i].a <= n && e[i].flow == 1) {
      int v = e[i].b;
      int idx = v - n;
      if (b[idx] == e[i].a) swap(a[idx], b[idx]);
    }
  }
  cout << ans << '\n';
  for (int i = 1; i <= m; i++) cout << a[i] << " " << b[i] << '\n';
  return 0;
}
