#include <bits/stdc++.h>
const bool debug = false;
int triple[1 << 12][3];
int use[1 << 12];
int cost[1 << 12];
std::vector<int> gen_masks(int L) {
  std::vector<int> masks;
  masks.push_back(0);
  for (int i = 0; i < L; i++) {
    for (int j = 1; j < L; j++) {
      if (i + j * 2 >= L) continue;
      masks.push_back((1 << i) | (1 << (i + j)) | (1 << (i + 2 * j)));
    }
  }
  return masks;
}
int as[100005];
int main() {
  std::vector<int> masks = gen_masks(12);
  for (int u : masks) {
    for (int v : masks) {
      for (int w : masks) {
        int res = (u ^ v ^ w) & ((1 << 9) - 1);
        triple[res][0] = u;
        triple[res][1] = v;
        triple[res][2] = w;
      }
    }
  }
  std::vector<std::array<int, 3> > moves;
  int NN;
  scanf("%d", &NN);
  int N = NN;
  for (int i = 1; i <= N; i++) {
    scanf("%d", &as[i]);
  }
  while (N >= 12) {
    int M = 0;
    for (int i = 0; i < 9; i++) {
      M |= (as[N - i] << i);
    }
    for (int t = 0; t < 3; t++) {
      std::array<int, 3> move;
      int index = 0;
      for (int i = 0; i < 12; i++) {
        if (triple[M][t] & (1 << i)) {
          as[N - i] ^= 1;
          move[index++] = N - i;
        }
      }
      if (index) {
        assert(index == 3);
        moves.push_back(move);
      }
    }
    N -= 9;
  }
  N = std::min(NN, 12);
  masks = gen_masks(N);
  for (int i = 1; i < (1 << N); i++) {
    cost[i] = 1e9;
  }
  for (int mask : masks) {
    for (int i = 0; i < (1 << N); i++) {
      if (cost[i ^ mask] > cost[i] + 1) {
        cost[i ^ mask] = cost[i] + 1;
        use[i ^ mask] = mask;
      }
    }
  }
  if (debug) {
    int worst = 0;
    for (int i = 0; i < (1 << N); i++) {
      if (cost[i] < 1e9) worst = std::max(worst, cost[i]);
      printf("%d: ", i);
      for (int k = 0; k < N; k++) {
        printf("%d", (use[i] >> k) & 1);
      }
      printf("\n");
    }
    printf("WORST: %d\n", worst);
  }
  while (true) {
    int M = 0;
    for (int i = 0; i < N; i++) {
      M |= (as[N - i] << i);
    }
    if (M == 0) break;
    std::array<int, 3> move;
    int index = 0;
    for (int i = 0; i < 12; i++) {
      if (use[M] & (1 << i)) {
        as[N - i] ^= 1;
        move[index++] = N - i;
      }
    }
    if (index == 0) {
      printf("NO\n");
      return 0;
    }
    assert(index == 3);
    moves.push_back(move);
  }
  for (int i = 0; i < N; i++) {
    assert(as[i] == 0);
  }
  printf("YES\n");
  printf("%d\n", (int)moves.size());
  for (auto move : moves) {
    printf("%d %d %d\n", move[0], move[1], move[2]);
  }
  return 0;
}
