#include <bits/stdc++.h>
using namespace std;
void fail() {
  cout << "NO" << endl;
  exit(0);
}
int main() {
  int N, K, V;
  cin >> N >> K >> V;
  vector<int> A(N);
  for (int i = 0; i < N; i++) cin >> A[i];
  vector<vector<int>> dp(N + 1, vector<int>(K, -1));
  dp[0][0] = 0;
  for (int i = 0; i < N; i++)
    for (int j = 0; j < K; j++) {
      if (dp[i][j] >= 0) {
        dp[i + 1][j] = j;
        dp[i + 1][(j + A[i]) % K] = j;
      }
    }
  int r = V % K;
  if (dp[N][r] == -1) fail();
  vector<int> use, not_use;
  for (int i = N - 1; i >= 0; i--) {
    if (dp[i + 1][r] != r) {
      use.push_back(i);
      r = dp[i + 1][r];
    } else {
      not_use.push_back(i);
    }
  }
  vector<vector<int>> ans;
  const int M = 1e9;
  int u, n;
  if (use.size() == 0) {
    u = 0, n = N - 1;
    for (int i = 0; i < N - 1; i++) {
      ans.push_back({M, i, N - 1});
      A[N - 1] += A[i];
      A[i] = 0;
    }
  } else if (not_use.size() == 0) {
    u = 0, n = N - 1;
    for (int i = 1; i < N; i++) {
      ans.push_back({M, i, 0});
      A[0] += A[i];
      A[i] = 0;
    }
  } else {
    u = use[0], n = not_use[0];
    for (int i : use)
      if (i != u) {
        ans.push_back({M, i, u});
        A[u] += A[i];
        A[i] = 0;
      }
    for (int i : not_use)
      if (i != n) {
        ans.push_back({M, i, n});
        A[n] += A[i];
        A[i] = 0;
      }
  }
  if (A[u] > V) {
    int d = (A[u] - V) / K;
    ans.push_back({d, u, n});
    A[u] -= d * K;
    A[n] += d * K;
  }
  if (A[u] < V) {
    int d = (V - A[u]) / K;
    ans.push_back({d, n, u});
    A[u] += d * K;
    A[n] -= d * K;
    if (A[n] < 0) fail();
  }
  cout << "YES" << endl;
  for (auto& v : ans)
    cout << v[0] << " " << v[1] + 1 << " " << v[2] + 1 << endl;
  for (int a : A) cerr << a << " ";
  cerr << endl;
  return 0;
}
