#include <bits/stdc++.h>
using namespace std;
int n, m, S, T, du[10010];
struct edge {
  int u, v, cap, flow;
  edge() {}
  edge(int u, int v, int c, int f) : u(u), v(v), cap(c), flow(f) {}
};
vector<edge> edges;
vector<int> e[10010];
inline void add_edge(int u, int v, int c) {
  edges.push_back(edge(u, v, c, 0));
  edges.push_back(edge(v, u, 0, 0));
  int m = edges.size();
  e[u].push_back(m - 2);
  e[v].push_back(m - 1);
}
int vis[10010], dis[10010], cur[10010];
bool bfs(int s, int t) {
  memset(vis, 0, sizeof(vis));
  queue<int> que;
  que.push(s);
  vis[s] = 1;
  dis[s] = 0;
  while (!que.empty()) {
    int now = que.front();
    que.pop();
    for (int i = 0; i < (e[now].size()); i++) {
      edge& nxt = edges[e[now][i]];
      if (!vis[nxt.v] && nxt.cap > nxt.flow) {
        vis[nxt.v] = 1;
        dis[nxt.v] = dis[now] + 1;
        que.push(nxt.v);
      }
    }
  }
  return vis[t];
}
int dfs(int st, int t, int low) {
  if (st == t || low == 0) return low;
  int flow = 0, f;
  for (int& i = cur[st]; i < e[st].size(); i++) {
    edge& nxt = edges[e[st][i]];
    if (dis[nxt.v] == dis[st] + 1 &&
        (f = dfs(nxt.v, t, min(low, nxt.cap - nxt.flow))) > 0) {
      nxt.flow += f;
      edges[e[st][i] ^ 1].flow -= f;
      flow += f;
      low -= f;
      if (low == 0) break;
    }
  }
  return flow;
}
int Dinic(int s, int t) {
  int ans = 0;
  while (bfs(s, t)) {
    memset(cur, 0, sizeof(cur));
    ans += dfs(s, t, 0x3f3f3f3f);
  }
  return ans;
}
pair<int, int> pp[10010];
bool check(int mid) {
  edges.clear();
  for (int i = 0; i <= n + m + 1; i++) e[i].clear();
  for (int i = 1; i <= m; i++) {
    add_edge(S, i, 1);
    add_edge(i, m + pp[i].first, 1);
    add_edge(i, m + pp[i].second, 1);
  }
  for (int i = 1; i <= n; i++) add_edge(m + i, T, min(du[i], mid));
  int ans = Dinic(S, T);
  if (ans < m) return false;
  return true;
}
pair<int, int> Ans[10010];
int main() {
  scanf("%d %d", &n, &m);
  S = 0, T = n + m + 1;
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    pp[i] = make_pair(u, v);
    du[u]++;
    du[v]++;
  }
  int L = 1, R = min(m, n - 1), ans = min(m, n - 1);
  while (L <= R) {
    int mid = (L + R) >> 1;
    if (check(mid)) {
      ans = mid;
      R = mid - 1;
    } else
      L = mid + 1;
  }
  cout << ans << endl;
  check(ans);
  int tmp = 0;
  for (int i = 0; i < edges.size(); i += 2) {
    if (edges[i].u <= m && edges[i].u >= 1 && edges[i].v >= m + 1 &&
        edges[i].v <= n + m && edges[i].cap == edges[i].flow) {
      int nxt = pp[edges[i].u].first;
      if (nxt == edges[i].v - m) nxt = pp[edges[i].u].second;
      Ans[++tmp] = make_pair(edges[i].v - m, nxt);
    }
  }
  for (int i = 1; i < (tmp + 1); i++)
    cout << Ans[i].first << " " << Ans[i].second << endl;
}
