#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 ss[NN];
int move(int cnt, int x, int y) {
  if (x == y) return 0;
  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 flag[NN];
int calc(int n, int v) {
  if (n == 0) return 0;
  if (dp[n - 1][((v - a[n]) % k + k) % k]) {
    flag[n] = 1;
    rt = n;
    calc(n - 1, ((v - a[n]) % k + k) % k);
    return 0;
  }
  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;
  }
  dp[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < k; j++)
      if (dp[i - 1][j]) {
        dp[i][j] = 1;
        dp[i][(j + a[i]) % k] = 1;
      }
  }
  if (!dp[n][v % k]) {
    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);
    }
  assert(ss[rt] % k == v % k);
  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);
}
