#include <bits/stdc++.h>
using namespace std;
int N, K, V;
int a[5005];
int modk[5005];
int used[5005];
int sumused;
int goal;
int trash;
char dp[5005][5005];
void pour(int num, int from, int to) {
  if (num == 0) return;
  cout << num << " " << from << " " << to << endl;
}
int empty(int num) { return (num - 1) / K + 1; }
void makeright(int goal, int trash, int goalV, int trashV, int V) {
  if (goalV == V) return;
  if (goalV > V) {
    int cnt = (goalV - V) / K;
    pour(cnt, goal, trash);
  } else {
    int cnt = (V - goalV) / K;
    pour(cnt, trash, goal);
  }
}
int main() {
  std::ios_base::sync_with_stdio(false);
  cin >> N >> K >> V;
  int sum = 0;
  for (int i = 1; i <= N; i++) {
    cin >> a[i];
    modk[i] = a[i] % K;
    sum += a[i];
  }
  if (sum < V) {
    cout << "NO" << endl;
    return 0;
  }
  dp[1][0] = 2;
  dp[1][modk[1]] = 1;
  for (int i = 2; i <= N; i++) {
    for (int j = 0; j <= K - 1; j++) {
      if (dp[i - 1][j]) {
        dp[i][j] = 2;
        dp[i][(j + modk[i]) % K] = 1;
      }
    }
  }
  if (dp[N][V % K] == 0) {
    cout << "NO" << endl;
    return 0;
  }
  cout << "YES" << endl;
  if (V % K == 0) {
    for (int i = 2; i <= N; i++) {
      pour(empty(a[i]), i, 1);
    }
    makeright(2, 1, 0, sum, V);
    return 0;
  }
  int currj = V % K;
  for (int i = N; i >= 1; i--) {
    if (dp[i][currj] == 1) {
      used[i] = true;
      sumused += a[i];
      currj = (currj + (K - modk[i])) % K;
      if (goal == 0) goal = i;
    }
  }
  for (int i = 1; i <= N; i++) {
    if (!used[i]) {
      trash = i;
      break;
    }
  }
  if (trash == 0) {
    int cnt = empty(a[2]);
    pour(cnt, 2, 1);
    for (int i = 3; i <= N; i++) {
      cnt = empty(a[i]);
      pour(cnt, i, 1);
    }
    makeright(1, 2, sumused, 0, V);
    return 0;
  }
  for (int i = 1; i <= N; i++) {
    if (used[i] && i != goal) {
      pour(empty(a[i]), i, goal);
    }
    if (!used[i] && i != trash) {
      pour(empty(a[i]), i, trash);
    }
  }
  makeright(goal, trash, sumused, sum - sumused, V);
}
