#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <class T>
inline T lcm(T a, T b) {
  if (a < 0) return lcm(-a, b);
  if (b < 0) return lcm(a, -b);
  return a * (b / __gcd(a, b));
}
template <class T>
T power(T N, T P) {
  return (P == 0) ? 1 : N * power(N, P - 1);
}
template <class T>
string itoa(T a) {
  if (!a) return "0";
  string ret;
  for (T i = a; i > 0; i = i / 10) ret.push_back((i % 10) + 48);
  reverse(ret.begin(), ret.end());
  return ret;
}
double log(double N, double B) { return (log10l(N)) / (log10l(B)); }
vector<string> token(string a, string b) {
  const char *q = a.c_str();
  while (count(b.begin(), b.end(), *q)) q++;
  vector<string> oot;
  while (*q) {
    const char *e = q;
    while (*e && !count(b.begin(), b.end(), *e)) e++;
    oot.push_back(string(q, e));
    q = e;
    while (count(b.begin(), b.end(), *q)) q++;
  }
  return oot;
}
string toBin(int n) {
  string s;
  for (int i = 32 - 1; i >= 0; i--) s += ((bool)(n & (1 << (i))) + '0');
  return s;
}
bool eq(long double a, long double b) { return fabs(a - b) < 1e-9; }
vector<int> g[5002];
int vis[5002];
int Left[5002], Right[5002];
bool dfs(int u) {
  if (vis[u]) return false;
  vis[u] = true;
  int v;
  for (int i = 0; i < (int)g[u].size(); i++) {
    v = g[u][i];
    if (Right[v] == -1) {
      Right[v] = u, Left[u] = v;
      return true;
    }
  }
  for (int i = 0; i < (int)g[u].size(); i++) {
    v = g[u][i];
    if (dfs(Right[v])) {
      Right[v] = u, Left[u] = v;
      return true;
    }
  }
  return false;
}
int match(int n) {
  int ret = 0;
  memset(Left, -1, sizeof(Left));
  ;
  memset(Right, -1, sizeof(Right));
  ;
  while (1) {
    bool done = true;
    memset(vis, 0, sizeof(vis));
    ;
    for (int i = 1; i <= n; i++) {
      if (Left[i] == -1 && dfs(i)) done = false;
    }
    if (done == true) break;
  }
  for (int i = 1; i <= n; i++)
    if (Left[i] != -1) ret++;
  return ret;
}
int c[5002];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= (int)n; i++) scanf("%d", &c[i]);
  for (int i = 1; i <= (int)n; i++) {
    for (int j = 1; j <= (int)n; j++) {
      if (c[j] != c[i]) {
        g[i].push_back(j);
      }
    }
  }
  int ret = match(n);
  printf("%d\n", ret);
  ;
  for (int i = 1; i <= n; i++) {
    if (Left[i] == -1)
      printf("%d %d\n", c[i], c[i]);
    else
      printf("%d %d\n", c[i], c[Left[i]]);
  }
}
