#include <bits/stdc++.h>
using namespace std;
struct node {
  int v, c, limit;
  node *opp, *next;
} mapp[41000];
node *listt[210];
int d[210], vd[210];
int e, n;
void addedge(int i, int j, int c) {
  mapp[++e].v = j;
  mapp[e].c = c;
  mapp[e].limit = c;
  mapp[e].opp = &mapp[e + 1];
  mapp[e].next = listt[i];
  listt[i] = &mapp[e];
  mapp[++e].v = i;
  mapp[e].c = 0;
  mapp[e].limit = 0;
  mapp[e].opp = &mapp[e - 1];
  mapp[e].next = listt[j];
  listt[j] = &mapp[e];
}
int min(int x, int y) { return ((x < y) ? x : y); }
int dfs(int i, int flow) {
  int j, temp, ff = 0;
  node *u;
  if (i == n) return (flow);
  u = listt[i];
  while (u != NULL) {
    j = u->v;
    if (u->c > 0 && d[i] == d[j] + 1) {
      temp = dfs(j, min(u->c, flow - ff));
      u->c = u->c - temp;
      u->opp->c = u->opp->c + temp;
      ff += temp;
      if (ff == flow) return (flow);
    }
    u = u->next;
  }
  if (d[1] >= n) return (ff);
  vd[d[i]]--;
  if (vd[d[i]] == 0) d[1] = n;
  d[i]++;
  vd[d[i]]++;
  return (ff);
}
int c[110];
int main() {
  e = 0;
  for (int i = 0; i < 210; i++) listt[i] = NULL;
  int N, M;
  scanf("%d%d", &N, &M);
  memset(c, 0, sizeof(c));
  for (int i = 1; i <= N; i++) {
    int rr;
    scanf("%d", &rr);
    c[rr]++;
  }
  for (int i = 1; i <= M; i++) {
    addedge(1, i + 1, c[i]);
    addedge(1 + M + i, 1 + M + M + 1, c[i]);
  }
  for (int i = 1; i <= M; i++)
    for (int j = 1; j <= M; j++)
      if (i != j) addedge(1 + i, 1 + M + j, 10000);
  n = 1 + M + M + 1;
  memset(d, 0, sizeof(d));
  memset(vd, 0, sizeof(vd));
  vd[0] = n;
  int maxflow = 0;
  while (d[1] <= n - 1) maxflow = maxflow + dfs(1, 100000000);
  printf("%d\n", maxflow);
  for (int i = 1; i <= M; i++) {
    for (node *u = listt[i + 1]; u != NULL; u = u->next) {
      int j = u->v;
      for (int k = 1; k <= max(u->limit - u->c, 0); k++) {
        printf("%d %d\n", i, j - 1 - M);
        c[i]--;
      }
    }
  }
  for (int i = 1; i <= M; i++)
    for (int j = 1; j <= c[i]; j++) printf("%d %d\n", i, i);
  return 0;
}
