#include <bits/stdc++.h>
using namespace std;
int const N = 5000;
bool dp[N + 1][N + 1];
int x[N + 1];
void no() {
  printf("NO\n");
  exit(0);
}
int main() {
  int n, k, v;
  scanf("%d%d%d", &n, &k, &v);
  for (int i = 1; i < (int)(n + 1); ++i) scanf("%d", x + i);
  dp[0][0] = true;
  for (int i = 0; i < (int)(n); ++i) {
    int y = x[i + 1] % k;
    for (int j = 0; j < (int)(k); ++j)
      if (dp[i][j])
        dp[i + 1][j] = true, dp[i + 1][j + y >= k ? j + y - k : j + y] = true;
  }
  if (!dp[n][v % k]) no();
  vector<pair<int, pair<int, int> > > an;
  vector<int> us;
  int u = n, q = v % k;
  while (u) {
    int tq = q - x[u] % k;
    if (tq < 0) tq += k;
    if (dp[u - 1][tq]) {
      q = tq;
      us.push_back(u);
    }
    --u;
  }
  int bs;
  if (us.empty()) {
    for (int i = 2; i < (int)(n + 1); ++i) {
      x[1] += x[i];
      an.push_back(make_pair((x[i] + k - 1) / k, make_pair(i, 1)));
      x[i] = 0;
    }
    bs = 2;
  } else
    bs = us.back();
  for (int i = 0; i < (int)(us.size() - 1); ++i) {
    int v = us[i];
    if (x[v] == 0) continue;
    x[bs] += x[v];
    an.push_back(make_pair((x[v] + k - 1) / k, make_pair(v, bs)));
    x[v] = 0;
  }
  int to = bs == 1 ? 2 : 1;
  for (int i = 1; i < (int)(n + 1); ++i)
    if (i != bs && i != to) {
      int v = i;
      if (x[v] == 0) continue;
      x[to] += x[v];
      an.push_back(make_pair((x[v] + k - 1) / k, make_pair(v, to)));
      x[v] = 0;
    }
  if (x[bs] < v) {
    for (int i = 1; i < (int)(n + 1); ++i)
      if (i != bs) {
        int cnt = min(x[i] / k, (v - x[bs]) / k);
        if (cnt == 0) continue;
        x[bs] += cnt * k;
        an.push_back(make_pair(cnt, make_pair(i, bs)));
      }
  } else if (x[bs] > v) {
    int to = bs == 1 ? 2 : 1, mv = x[bs] - v;
    x[bs] -= mv;
    an.push_back(make_pair(mv / k, make_pair(bs, to)));
  }
  if (x[bs] != v) no();
  printf("YES\n");
  for (int i = 0; i < (int)(an.size()); ++i)
    printf("%d %d %d\n", an[i].first, an[i].second.first, an[i].second.second);
}
