#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
long long N, K;
vector<long long> A;
bitset<2001> pbst[1 << 16];
long long i, j, k, l;
int main() {
  scanf("%lld%lld", &N, &K);
  A.resize(N);
  for (i = 0; i < N; i++) {
    long long a;
    scanf("%lld", &a);
    A[i] = a;
  }
  pbst[0][0] = true;
  for (i = 1; i < 1 << N; i++) {
    for (j = 0; j < N; j++) {
      if (i & (1 << j)) {
        pbst[i] |= pbst[i ^ (1 << j)] << A[j];
      }
    }
    for (j = 2000; j > 0; j--) {
      if (j % K) continue;
      if (pbst[i][j]) pbst[i][j / K] = true;
    }
  }
  if (!pbst[(1 << N) - 1][1]) {
    printf("NO\n");
    return 0;
  }
  printf("YES\n");
  i = (1 << N) - 1, j = 1, k = 0;
  priority_queue<pair<long long, long long> > pq;
  while (i) {
    while (j * K <= 2000 && pbst[i][j * K]) {
      j *= K;
      k++;
    }
    for (l = 0; l < N; l++) {
      if ((i & (1 << l)) && j >= A[l] && pbst[i ^ (1 << l)][j - A[l]]) {
        i ^= (1 << l);
        j -= A[l];
        pq.push({k, A[l]});
        break;
      }
    }
  }
  for (i = 1; i < N; i++) {
    auto qa = pq.top();
    pq.pop();
    auto qb = pq.top();
    pq.pop();
    printf("%lld %lld\n", qa.second, qb.second);
    long long nb = qa.second + qb.second;
    long long na = qa.first;
    while (nb % K == 0) {
      nb /= K;
      na--;
    }
    pq.push({na, nb});
  }
  return 0;
}
