#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5010;
const int INF = 0x3f3f3f3f;
int n, k, v, A[MAXN], B[MAXN], dp[MAXN][MAXN];
bool T[MAXN][MAXN], S[MAXN];
void pour(int from, int to, int Q = 0) {
  if (!Q) Q = B[from] + 1;
  printf("%d %d %d\n", Q, from, to);
  B[to] += B[from];
  A[to] += A[from];
  B[from] = A[from] = 0;
  if (A[to] >= k) {
    A[to] -= k;
    B[to]++;
  }
}
int main() {
  scanf("%d%d%d", &n, &k, &v);
  int vs = 0;
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    vs += x;
    A[i] = x % k;
    B[i] = x / k;
  }
  int q = v / k;
  int m = v % k;
  memset(dp[0], INF, sizeof(dp[0]));
  dp[0][0] = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 0; j < k; ++j) dp[i][j] = dp[i - 1][j];
    for (int j = 0; j < k; ++j) {
      if (j + A[i] >= k) {
        if (dp[i - 1][j] + 1 < dp[i][A[i] + j - k]) {
          dp[i][A[i] + j - k] = dp[i - 1][j] + 1;
          T[i][A[i] + j - k] = 1;
        }
      } else {
        if (dp[i - 1][j] + 1 < dp[i][A[i] + j]) {
          dp[i][A[i] + j] = dp[i - 1][j] + 1;
          T[i][A[i] + j] = 1;
        }
      }
    }
  }
  if (vs < v || dp[n][m] == INF) {
    puts("NO");
    return 0;
  }
  puts("YES");
  if (m == 0) {
    for (int i = 2; i <= n; ++i) {
      pour(i, 1);
    }
    if (q) printf("%d 1 2\n", q);
  } else {
    int cur = m;
    for (int i = n; i >= 1; --i) {
      if (T[i][cur]) {
        S[i] = 1;
        cur = (cur - A[i] + k) % k;
      }
    }
    if (S[1]) {
      for (int i = 2; i <= n; ++i)
        if (S[i]) pour(i, 1);
      for (int i = 3; i <= n; ++i)
        if (!S[i]) pour(i, 2);
      if (B[1]) pour(1, 2, B[1]);
      if (q) pour(2, 1, q);
    } else {
      for (int i = 2; i <= n; ++i)
        if (!S[i]) pour(i, 1);
      for (int i = 3; i <= n; ++i)
        if (S[i]) pour(i, 2);
      if (B[2]) pour(2, 1, B[2]);
      if (q) pour(1, 2, q);
    }
  }
}
