#include <bits/stdc++.h>
using namespace std;
int raiz = 1, fim;
int n, m;
vector<pair<int, int> > adj;
vector<pair<int, int> > ans;
const int inf = 0x20202020;
int vis[100010 * 20];
namespace flow {
const int M = 100010 * 5, N = 100010 * 5;
int y[M], nxt[M], gap[N], fst[N], c[N], pre[N], q[N], dis[N];
int f[M];
int S, T, tot, Tn;
void init(int s, int t, int tn) {
  tot = 1;
  assert(tn < N);
  for (int(i) = (0); (i) < (tn); (i)++) fst[i] = 0;
  S = s;
  T = t;
  Tn = tn;
}
int add(int u, int v, int c1, int c2 = 0) {
  tot++;
  y[tot] = v;
  f[tot] = c1;
  nxt[tot] = fst[u];
  fst[u] = tot;
  tot++;
  y[tot] = u;
  f[tot] = c2;
  nxt[tot] = fst[v];
  fst[v] = tot;
  return tot - 1;
}
int sap() {
  int u = S, t = 1;
  int flow = 0;
  for (int(i) = (0); (i) < (Tn); (i)++) c[i] = fst[i], dis[i] = Tn, gap[i] = 0;
  q[0] = T;
  dis[T] = 0;
  pre[S] = 0;
  for (int(i) = (0); (i) < (t); (i)++) {
    int u = q[i];
    for (int j = fst[u]; j; j = nxt[j])
      if (dis[y[j]] > dis[u] + 1 && f[j ^ 1])
        q[t++] = y[j], dis[y[j]] = dis[u] + 1;
  }
  for (int(i) = (0); (i) < (Tn); (i)++) gap[dis[i]]++;
  while (dis[S] <= Tn) {
    while (c[u] && (!f[c[u]] || dis[y[c[u]]] + 1 != dis[u])) c[u] = nxt[c[u]];
    if (c[u]) {
      pre[y[c[u]]] = c[u] ^ 1;
      u = y[c[u]];
      if (u == T) {
        int minf = inf;
        for (int p = pre[T]; p; p = pre[y[p]]) minf = min(minf, f[p ^ 1]);
        for (int p = pre[T]; p; p = pre[y[p]]) f[p ^ 1] -= minf, f[p] += minf;
        flow += minf;
        u = S;
      }
    } else {
      if (!(--gap[dis[u]])) break;
      int mind = Tn;
      c[u] = fst[u];
      for (int j = fst[u]; j; j = nxt[j])
        if (f[j] && dis[y[j]] < mind) mind = dis[y[j]], c[u] = j;
      dis[u] = mind + 1;
      gap[dis[u]]++;
      if (u != S) u = y[pre[u]];
    }
  }
  q[0] = T;
  vis[T] = 1;
  t = 1;
  for (int(i) = (0); (i) < (t); (i)++) {
    int u = q[i];
    for (int j = fst[u]; j; j = nxt[j])
      if (!vis[y[j]] && f[j ^ 1]) q[t++] = y[j], vis[y[j]] = 1;
  }
  return flow;
}
};  // namespace flow
vector<int> pica;
bool pode(int val) {
  pica.clear();
  fim = n + m + 2;
  flow::init(1, fim, fim + 1);
  for (int(i) = (2); (i) < (n + 2); (i)++) flow::add(1, i, val);
  for (int(i) = (0); (i) < (((int)(adj).size())); (i)++) {
    pica.push_back(flow::add(adj[i].first + 1, i + n + 2, 1));
    pica.push_back(flow::add(adj[i].second + 1, i + n + 2, 1));
    flow::add(i + n + 2, fim, 1);
  }
  int fl = flow::sap();
  if (fl < m) return 0;
  ans.clear();
  for (int(i) = (0); (i) < (((int)(adj).size())); (i)++) {
    if (!flow::f[pica[i * 2]])
      ans.push_back(make_pair(adj[i].first, adj[i].second));
    else
      ans.push_back(make_pair(adj[i].second, adj[i].first));
  }
  return 1;
}
int main() {
  scanf("%d %d", &n, &m);
  fim = n + m + 2;
  for (int(i) = (0); (i) < (m); (i)++) {
    int a, b;
    scanf("%d%d", &a, &b);
    adj.push_back(make_pair(a, b));
  }
  int l = 0, r = 50010, res = -1;
  while (r >= l) {
    int mid = (l + r) >> 1;
    if (pode(mid)) {
      r = mid - 1;
      res = mid;
    } else
      l = mid + 1;
  }
  printf("%d\n", res);
  for (int(i) = (0); (i) < (((int)(ans).size())); (i)++) {
    printf("%d %d\n", ans[i].first, ans[i].second);
  }
}
