#include <bits/stdc++.h>
using namespace std;
int a[16];
bitset<2001> dp[1 << 16];
int ans[16];
int findAns(int m, int num, int n, int k) {
  if (m == 0)
    return 0;
  else if (((num * k) <= 2000) && dp[m][num * k]) {
    int i;
    for (i = 0; i < n; i++) {
      if (m & (1 << i)) ans[i]++;
    }
    findAns(m, num * k, n, k);
    return 0;
  }
  int i;
  for (i = 0; i < n; i++) {
    if ((m & (1 << i)) && (num >= a[i]) && dp[m ^ (1 << i)][num - a[i]]) {
      findAns(m ^ (1 << i), num - a[i], n, k);
      return 0;
    }
  }
  return 0;
}
priority_queue<pair<int, int> > H;
int main() {
  int i;
  int n, k;
  scanf("%d %d", &n, &k);
  for (i = 0; i < n; i++) scanf("%d", &a[i]);
  int j;
  dp[0][0] = 1;
  for (i = 1; i < (1 << n); i++) {
    for (j = 0; j < n; j++) {
      if (i & (1 << j)) dp[i] |= dp[i ^ (1 << j)] << a[j];
    }
    for (j = 2000 / k; j >= 0; j--) {
      if (dp[i][j * k]) dp[i][j] = 1;
    }
  }
  if (dp[(1 << n) - 1][1]) {
    printf("YES\n");
    findAns((1 << n) - 1, 1, n, k);
    for (i = 0; i < n; i++) H.push(make_pair(ans[i], a[i]));
    for (i = 0; i < n - 1; i++) {
      pair<int, int> a = H.top();
      H.pop();
      pair<int, int> b = H.top();
      H.pop();
      printf("%d %d\n", a.second, b.second);
      int s = a.second + b.second;
      while ((s % k) == 0) s /= k, a.first--;
      H.push(make_pair(a.first, s));
    }
  } else
    printf("NO\n");
  return 0;
}
