#include <bits/stdc++.h>
using namespace std;
constexpr size_t MAXN = 5000;
constexpr size_t MAXK = 5000;
bitset<MAXK> possible[MAXN];
bitset<MAXK> is_take[MAXN];
inline int positive_mod(int x, int mod) { return ((x % mod) + mod) % mod; }
inline int divide_round_up(int x, int mod) { return (x + (mod - 1)) / mod; }
inline void print_op(int scoop_count, int x, int y) {
  if (scoop_count == 0) return;
  printf("%d %d %d\n", scoop_count, x + 1, y + 1);
}
int main() {
  int n, k, v;
  scanf("%d%d%d", &n, &k, &v);
  int volume[n];
  int volume_sum = 0;
  for (int i = 0; i < n; i++) {
    scanf("%d", &volume[i]);
    volume_sum += volume[i];
  }
  if (volume_sum < v) {
    printf("NO\n");
    return 0;
  }
  possible[0][0] = true;
  is_take[0][0] = false;
  possible[0][volume[0] % k] = true;
  is_take[0][volume[0] % k] = true;
  for (int i = 1; i < n; i++) {
    for (int j = 0; j < k; j++) {
      if (possible[i - 1][positive_mod(j - volume[i], k)]) {
        possible[i][j] = true;
        is_take[i][j] = true;
      }
      if (possible[i - 1][j]) {
        possible[i][j] = true;
        is_take[i][j] = false;
      }
    }
  }
  if (!possible[n - 1][v % k]) {
    printf("NO\n");
    return 0;
  }
  printf("YES\n");
  bitset<MAXN> is_required;
  is_required.reset();
  int used_main_tank = -1, unused_main_tank = -1;
  for (int i = n - 1, curr_volume = v % k; i >= 0; --i) {
    if (is_take[i][curr_volume]) {
      is_required[i] = true;
      curr_volume = positive_mod(curr_volume - volume[i], k);
      used_main_tank = i;
    } else {
      unused_main_tank = i;
    }
  }
  int new_volume_used = 0;
  int new_volume_unused = 0;
  for (int i = 0; i < n; i++) {
    if (is_required[i] && used_main_tank != -1) {
      new_volume_used += volume[i];
      print_op(divide_round_up(volume[i], k), i, used_main_tank);
    } else if (!is_required[i] && unused_main_tank != -1 &&
               i != unused_main_tank) {
      new_volume_unused += volume[i];
      print_op(divide_round_up(volume[i], k), i, unused_main_tank);
    }
  }
  if (used_main_tank == -1) {
    used_main_tank = (unused_main_tank + 1) % k;
  } else if (unused_main_tank == -1) {
    unused_main_tank = (used_main_tank + 1) % k;
  }
  if (new_volume_used > v) {
    int extra_scoops = (new_volume_used - v) / k;
    print_op(extra_scoops, used_main_tank, unused_main_tank);
  } else if (new_volume_used < v) {
    int extra_scoops = (v - new_volume_used) / k;
    print_op(extra_scoops, unused_main_tank, used_main_tank);
  }
}
