#include <bits/stdc++.h>
using namespace std;
using INT = long long;
const int NN = 5050;
const int inf = 0x3f3f3f3f;
int dp[NN][NN];
int a[NN];
int n, k, v;
int tmp[NN];
int ss[NN];
int move(int cnt, int x, int y) {
  if (cnt == 0) return 0;
  int u = min((INT)ss[x], (INT)k * cnt);
  ss[x] -= u;
  ss[y] += u;
  printf("%d %d %d\n", cnt, x, y);
}
int rt = -1;
int num[NN];
int flag[NN];
int calc(int n, int v) {
  if (n == 0) return 0;
  if (dp[n][v] == dp[n - 1][((v - a[n]) % k + k) % k] + a[n]) {
    num[n] = 1e9;
    flag[n] = 1;
    rt = n;
    calc(n - 1, ((v - a[n]) % k + k) % k);
    return 0;
  }
  if (dp[n][v] == dp[n - 1][v] + a[n] / k * k) {
    num[n] = a[n] / k;
    calc(n - 1, v);
    return 0;
  }
}
int main() {
  cin >> n >> k >> v;
  int tot = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", a + i);
    tot += a[i];
    ss[i] = a[i];
  }
  if (tot < v) return puts("NO"), 0;
  if (v % k == 0) {
    if (tot < v) return puts("NO"), 0;
    puts("YES");
    for (int i = 2; i <= n; i++) {
      move(1e9, i, 1);
    }
    move(v / k, 1, 2);
    assert(ss[2] == v);
    return 0;
  }
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j < k; j++) {
      dp[i][j] = -inf;
    }
  }
  dp[0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < k; j++) tmp[j] = -inf;
    for (int j = 0; j < k; j++) {
      tmp[(j + a[i]) % k] = max(dp[i - 1][j] + a[i], tmp[(j + a[i]) % k]);
    }
    for (int j = 0; j < k; j++) {
      dp[i][j] = max(dp[i - 1][j] + a[i] / k * k, tmp[j]);
    }
  }
  if (dp[n][v % k] < 0) {
    return puts("NO"), 0;
  }
  puts("YES");
  calc(n, v % k);
  assert(rt != -1);
  for (int i = 1; i <= n; i++)
    if (i != rt and flag[i]) {
      move(1e9, i, rt);
    }
  int x = 1;
  (rt == 1 ? x = 2 : x = 1);
  for (int i = 1; i <= n; i++)
    if (ss[i] and i != x and i != rt) {
      move(1e9, i, x);
    }
  move(ss[x] / k, x, rt);
  move((ss[rt] - v) / k, rt, x);
  assert(ss[rt] == v);
}
