#include <bits/stdc++.h>
using namespace std;
const double PI = 3.1415926535897932384626433832795;
const double EPS = 1e-10;
template <typename T>
T GCD(T a, T b);
template <typename T>
T EX_GCD(T a, T b, T& x, T& y);
template <typename T>
T POW(T x, T n);
int SOLVE() {
  int n, m;
  cin >> n >> m;
  vector<int> left(n), right(n);
  vector<pair<int, int> > cnt(m + 1);
  for (int i = (int)0; i < (int)n; i += 1) {
    cin >> left[i];
    ++cnt[left[i]].first;
    cnt[left[i]].second = left[i];
  }
  sort(cnt.rbegin(), cnt.rend());
  int maxCnt = cnt[0].first;
  vector<int> seq, shiftedSeq;
  seq.reserve(n);
  for (int i = (int)0; i < (int)m; i += 1)
    for (int j = (int)0; j < (int)cnt[i].first; j += 1)
      seq.push_back(cnt[i].second);
  shiftedSeq = seq;
  reverse(shiftedSeq.begin(), shiftedSeq.end());
  reverse(shiftedSeq.begin(), shiftedSeq.begin() + n - maxCnt);
  int ans = 0;
  for (int i = (int)0; i < (int)n; i += 1) {
    if (seq[i] != shiftedSeq[i]) {
      ++ans;
      for (int j = (int)0; j < (int)n; j += 1) {
        if (left[j] == seq[i] && !right[j]) {
          right[j] = shiftedSeq[i];
          break;
        }
      }
    }
  }
  for (int i = (int)0; i < (int)n; i += 1)
    if (!right[i]) right[i] = left[i];
  cout << ans << endl;
  for (int i = (int)0; i < (int)n; i += 1)
    cout << left[i] << ' ' << right[i] << endl;
  cout << endl;
  return 0;
}
int main() {
  ios::sync_with_stdio(false);
  return SOLVE();
}
template <typename T>
T GCD(T a, T b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
template <typename T>
T EX_GCD(T a, T b, T& x, T& y) {
  if (b == 0) {
    x = 1, y = 0;
    return a;
  }
  T x_, y_;
  T gcd = EX_GCD(b, a % b, x_, y_);
  x = y_, y = x_ - (a / b) * y_;
  return gcd;
}
template <typename T>
T POW(T x, T n) {
  T result = 1;
  while (n) {
    if (n & 1) result *= x;
    x *= x;
    n >>= 1;
  }
  return result;
}
