#include <bits/stdc++.h>
using namespace std;
long long po(long long a, long long b) {
  long long x = 1, y = a;
  while (b > 0) {
    if (b % 2) {
      x = x * y;
      x %= 1000000007;
    }
    y = y * y;
    y %= 1000000007;
    b /= 2;
  }
  return x;
}
const int MAXN = 20005;
const int INF = 1000000000;
struct edge {
  int a, b, cap, flow;
};
int n = MAXN, s = 0, t = MAXN - 1, d[MAXN], ptr[MAXN], q[MAXN];
vector<edge> e;
vector<int> g[MAXN];
void clear_dinic() {
  e.clear();
  for (int i = 0; i < MAXN; i++) {
    g[i].clear();
  }
}
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((int)e.size());
  e.push_back(e1);
  g[b].push_back((int)e.size());
  e.push_back(e2);
}
bool bfs() {
  int qh = 0, qt = 0;
  q[qt++] = s;
  for (int i = 0; i < n; i++) {
    d[i] = -1;
  }
  d[s] = 0;
  while (qh < qt && d[t] == -1) {
    int v = q[qh++];
    for (size_t i = 0; i < g[v].size(); ++i) {
      int id = g[v][i], to = e[id].b;
      if (d[to] == -1 && e[id].flow < e[id].cap) {
        q[qt++] = to;
        d[to] = d[v] + 1;
      }
    }
  }
  return d[t] != -1;
}
int dfs(int v, int flow) {
  if (!flow) return 0;
  if (v == t) return flow;
  for (; ptr[v] < (int)g[v].size(); ++ptr[v]) {
    int id = g[v][ptr[v]], to = e[id].b;
    if (d[to] != d[v] + 1) continue;
    int pushed = dfs(to, 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;
  for (;;) {
    if (!bfs()) break;
    memset(ptr, 0, n * sizeof ptr[0]);
    while (int pushed = dfs(s, INF)) flow += pushed;
  }
  return flow;
}
const int K = 10000;
void process_edge(int u, int v, int n, int c) {
  add_edge(u, K + 2 * c + 1, 1);
  add_edge(v, K + 2 * c + 1, 1);
  add_edge(K + 2 * c + 1, K + 2 * c + 2, 1);
  add_edge(K + 2 * c + 2, u + n, 1);
  add_edge(K + 2 * c + 2, v + n, 1);
}
int main() {
  if (0) {
    freopen("C:/Users/gold/Desktop/sublime IO/input.txt", "r", stdin);
    freopen("C:/Users/gold/Desktop/sublime IO/output.txt", "w", stdout);
  }
  int T = 1;
  while (T--) {
    int n, m;
    scanf("%d %d", &n, &m);
    vector<pair<int, int> > edges;
    for (int i = 0; i < m; i++) {
      int a, b;
      scanf("%d %d", &a, &b);
      edges.push_back(make_pair(a, b));
    }
    int lo = 0, high = m;
    int ans1 = m;
    while (lo <= high) {
      int mi = (lo + high) >> 1;
      clear_dinic();
      for (int i = 0; i < edges.size(); i++) {
        int a = edges[i].first;
        int b = edges[i].second;
        process_edge(a, b, n, i);
      }
      for (int i = 1; i <= n; i++) {
        add_edge(s, i, mi);
      }
      for (int i = 1; i <= n; i++) {
        add_edge(n + i, t, INF);
      }
      int flow = dinic();
      assert(flow <= m);
      if (flow == m) {
        high = mi - 1;
        ans1 = mi;
      } else {
        lo = mi + 1;
      }
    }
    printf("%d\n", ans1);
    int mi = ans1;
    clear_dinic();
    for (int i = 0; i < edges.size(); i++) {
      int a = edges[i].first;
      int b = edges[i].second;
      process_edge(a, b, n, i);
    }
    for (int i = 1; i <= n; i++) {
      add_edge(s, i, mi);
    }
    for (int i = 1; i <= n; i++) {
      add_edge(n + i, t, INF);
    }
    int flow = dinic();
    assert(flow == m);
    static int ans[5005];
    for (int i = 0; i < m; i++) {
      ans[i] = -1;
    }
    for (int i = 0; i < e.size(); i++) {
      if (e[i].a == s || e[i].b == t) {
        continue;
      }
      if (e[i].a >= 1 && e[i].a <= n && e[i].flow == 1) {
        int other = e[i].b;
        e[i].b -= K;
        e[i].b--;
        e[i].b /= 2;
        assert(ans[e[i].b] == -1);
        ans[e[i].b] = e[i].a;
      }
    }
    for (int i = 0; i < m; i++) {
      assert(ans[i] != -1);
      if (edges[i].first == ans[i]) {
      } else {
        swap(edges[i].first, edges[i].second);
      }
      printf("%d %d\n", edges[i].first, edges[i].second);
    }
  }
  return 0;
}
