#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using pii = pair<int, int>;
using vi = vector<int>;
struct res {
  int x, t;
  bool operator<(const res &z) const { return x < z.x; }
  bool operator==(const res &z) const { return x == z.x && t == z.t; }
};
const res E = {-1, 0};
const int M = 1e9;
void q(int cnt, int x, int y) {
  if (cnt) cout << cnt << ' ' << x + 1 << ' ' << y + 1 << '\n';
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0), cout << setprecision(15);
  int n, k, v;
  cin >> n >> k >> v;
  vi a(n);
  for (int &x : a) cin >> x;
  vector<vector<res>> dp(n + 1, vector<res>(k, E));
  dp[0][0] = {0, 0};
  for (int i = 1; i <= n; ++i) {
    dp[i] = dp[i - 1];
    for (res &r : dp[i]) r.t = 0;
    for (int j = 0; j < k; ++j)
      if (!(dp[i - 1][j] == E)) {
        auto &l = dp[i][(j + a[i - 1]) % k];
        l = max(l, {dp[i - 1][j].x + a[i - 1], 1});
        dp[i][j] = max(dp[i][j], {dp[i - 1][j].x + a[i - 1] / k * k, 0});
      }
  }
  if (dp[n][v % k] == E) return cout << "NO\n", 0;
  vi b, g;
  for (int i = n, c = v % k; i >= 1; --i) {
    if (dp[i][c].t)
      b.push_back(i - 1), c = (c - a[i - 1] % k + k) % k;
    else
      g.push_back(i - 1);
  }
  int cap = 0;
  for (int x : b) cap += a[x];
  int ad = 0;
  for (int x : g) ad += a[x];
  cap += ad / k * k;
  if (cap < v) return cout << "NO\n", 0;
  cout << "YES\n";
  int r, cur = 0, ot;
  if (((int)(b).size())) {
    r = b[0], cur = a[r];
    for (int i = 1; i < ((int)(b).size()); ++i) {
      q(M, b[i], r), cur += a[b[i]];
    }
    ot = r == 0 ? 1 : 0;
  } else {
    r = 0, ot = 1;
    q(M, r, ot);
  }
  for (int x : g)
    if (x != ot) q(M, x, ot);
  q(cur / k, r, ot), cur %= k;
  q((v - cur) / k, ot, r);
}
