#include <bits/stdc++.h>
using namespace std;
const int maxn = 102000;
int n, a[maxn], f[1 << 12];
struct node {
  int x, y, z;
};
vector<node> des[64];
void init() {
  queue<int> q;
  int N = 6;
  memset(f, 0x3f, sizeof(f));
  f[0] = 0;
  q.push(0);
  while (!q.empty()) {
    int k = q.front();
    q.pop();
    for (int i = 0; i < N; i++) {
      if (f[k ^ (1 << i)] > f[k] + 1) {
        for (int j = 0; j < des[k].size(); j++)
          des[k ^ (1 << i)].push_back(des[k][j]);
        des[k ^ (1 << i)].push_back((node){i, 6, 12 - i});
        f[k ^ (1 << i)] = f[k] + 1;
        q.push(k ^ (1 << i));
      }
      for (int j = i + 1; j < N; j++) {
        int z = (1 << i) + (1 << j);
        if (j + (j - i) < N) z |= (1 << 2 * j - i);
        if (f[k ^ z] > f[k] + 1) {
          for (int fr = 0; fr < des[k].size(); fr++)
            des[k ^ z].push_back(des[k][fr]);
          des[k ^ z].push_back((node){i, j, 2 * j - i});
          f[k ^ z] = f[k] + 1;
          q.push(k ^ z);
        }
      }
    }
  }
}
node opt[maxn];
int num;
node lst[maxn];
void Remain() {
  queue<int> q;
  memset(f, 0x3f, sizeof(f));
  f[0] = 0;
  q.push(0);
  int N = min(n, 12);
  while (!q.empty()) {
    int k = q.front();
    q.pop();
    for (int i = 0; i < N; i++) {
      for (int j = i + 1; j < N; j++) {
        if (j + (j - i) >= N) break;
        int z = (1 << i) + (1 << j) + (1 << 2 * j - i);
        if (f[k ^ z] > f[k] + 1) {
          f[k ^ z] = f[k] + 1;
          lst[k ^ z] = (node){i, j, 2 * j - i};
          q.push(k ^ z);
        }
      }
    }
  }
  int z = 0;
  for (int i = n - N + 1; i <= n; i++) {
    z = (z << 1) + a[i];
  }
  if (f[z] > 1e8) {
    puts("NO");
  } else {
    puts("YES");
    printf("%d\n", num + f[z]);
    for (int i = 1; i <= num; i++) {
      printf("%d %d %d\n", opt[i].x, opt[i].y, opt[i].z);
    }
    while (z) {
      printf("%d %d %d\n", n - lst[z].z, n - lst[z].y, n - lst[z].x);
      int pp = z;
      z ^= (1 << lst[pp].x);
      z ^= (1 << lst[pp].y);
      z ^= (1 << lst[pp].z);
    }
  }
}
void work() {
  for (int i = 1; i <= n; i += 6) {
    if (i + 12 > n) break;
    int z = (a[i + 5] << 5) + (a[i + 4] << 4) + (a[i + 3] << 3) +
            (a[i + 2] << 2) + (a[i + 1] << 1) + a[i];
    for (int j = 0; j < des[z].size(); j++) {
      opt[++num] = des[z][j];
      opt[num].x += i;
      opt[num].y += i;
      opt[num].z += i;
      a[opt[num].x] ^= 1;
      a[opt[num].y] ^= 1;
      a[opt[num].z] ^= 1;
    }
  }
  Remain();
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  init();
  work();
  return 0;
}
