#include <bits/stdc++.h>
using namespace std;
void read_file(bool outToFile = true) {}
int n, m;
int A[(5000 + 9)];
int cnt[(100 + 9)];
typedef pair<pair<int, int>, pair<int, int> > Edge;
typedef vector<Edge *> EdgeList;
vector<EdgeList> G;
int flow;
Edge *par[(2 * (100 + 9) + 2 + 9)];
int src = 0, snk = 1;
bool BFS() {
  queue<int> Q;
  Q.push(src);
  memset(par, 0, sizeof par);
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    if (u == snk) return 1;
    for (int i = 0, sz = G[u].size(); i < sz; i++) {
      int v, w;
      if (u == G[u][i]->first.first) {
        v = G[u][i]->first.second;
        w = G[u][i]->second.first;
      } else {
        v = G[u][i]->first.first;
        w = G[u][i]->second.second;
      }
      if (par[v] != NULL || v == 0 || w == 0) continue;
      Q.push(v);
      par[v] = G[u][i];
    }
  }
  return 0;
}
void augment(int v = snk, int minEdge = (1000000000)) {
  if (v == src) {
    flow = minEdge;
    return;
  }
  int u, *w, *rw;
  if (v == par[v]->first.second) {
    u = par[v]->first.first;
    w = &par[v]->second.first;
    rw = &par[v]->second.second;
  } else {
    u = par[v]->first.second;
    w = &par[v]->second.second;
    rw = &par[v]->second.first;
  }
  augment(u, min(minEdge, *w));
  *w -= flow;
  *rw += flow;
}
int max_flow() {
  int mf = 0;
  while (BFS()) {
    augment();
    mf += flow;
  }
  return mf;
}
void init() { G.assign(2 * m + 2, EdgeList()); }
void add_edge(int u, int v, int w, int rw) {
  Edge *e = new Edge(make_pair(u, v), make_pair(w, rw));
  G[u].push_back(e);
  G[v].push_back(e);
}
int main() {
  read_file();
  while (scanf("%d%d", &n, &m) != EOF) {
    memset(cnt, 0, sizeof cnt);
    for (int i = 0; i < n; i++) {
      scanf("%d", &A[i]);
      A[i]--;
      cnt[A[i]]++;
    }
    init();
    for (int i = 0; i < m; i++) {
      int u, v;
      u = 0;
      v = i + 2;
      add_edge(u, v, cnt[i], 0);
      u = i + m + 2;
      v = 1;
      add_edge(u, v, cnt[i], 0);
    }
    for (int i = 0; i < m; i++) {
      for (int j = 0; j < m; j++) {
        if (i == j) continue;
        int u, v;
        u = i + 2;
        v = j + 2 + m;
        add_edge(u, v, (1000000000), 0);
      }
    }
    int ans = max_flow();
    printf("%d\n", ans);
    for (int j = 0; j < m; j++) {
      int u = j + 2;
      for (int i = 0, sz = G[u].size(); i < sz; i++) {
        int x, y, w;
        x = u - 2 + 1;
        if (u == G[u][i]->first.first) {
          y = G[u][i]->first.second - 2 - m + 1;
          w = G[u][i]->second.second;
        } else {
          y = x;
          w = G[u][i]->second.first;
        }
        for (int k = 0; k < w; k++) printf("%d %d\n", x, y);
      }
    }
    printf("\n");
  }
}
