#include <bits/stdc++.h>
using namespace std;
int n, tans, a[100005], qaq[100005], que[1 << 15];
bool vis[1 << 15];
struct node {
  int x, y, z;
} ans[100005 << 1];
struct node2 {
  int ty, lst, pos;
} pre[1 << 15];
void ins(int x, int y, int z) {
  a[x] ^= 1, a[y] ^= 1, a[z] ^= 1;
  ans[++tans] = (node){x, y, z};
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  int sour = 0;
  int h = 1, t = 1, yn = min(n, 12);
  que[1] = sour, vis[sour] = 1;
  while (h <= t) {
    int tmp = que[h++];
    for (int i = 0; i < yn; i++) qaq[i] = (tmp & (1 << i)) != 0;
    for (int ty = 1; ty <= 6; ty++)
      for (int j = 0; j < yn - ty * 2; j++) {
        qaq[j] ^= 1, qaq[j + ty] ^= 1, qaq[j + 2 * ty] ^= 1;
        int ttmp = 0;
        for (int j = 0; j < yn; j++) ttmp += qaq[j] * (1 << j);
        if (!vis[ttmp])
          vis[que[++t] = ttmp] = 1, pre[ttmp] = (node2){ty, tmp, j + 1};
        qaq[j] ^= 1, qaq[j + ty] ^= 1, qaq[j + 2 * ty] ^= 1;
      }
  }
  int tmp;
  for (tmp = n - 6; tmp >= 7; tmp -= 6) {
    int tcnt = 0, tt = 0;
    for (int i = tmp + 1; i <= tmp + 6; i++) tcnt += a[i];
    if (tcnt == 6)
      ins(tmp + 1, tmp + 2, tmp + 3), ins(tmp + 4, tmp + 5, tmp + 6);
    else if (tcnt == 5) {
      if (a[tmp + 4] == 0)
        ins(tmp + 1, tmp + 3, tmp + 5), ins(tmp - 2, tmp + 2, tmp + 6);
      else if (a[tmp + 1] == 0)
        ins(tmp + 3, tmp + 4, tmp + 5), ins(tmp - 2, tmp + 2, tmp + 6);
      else {
        for (int i = tmp + 4; i > tmp; i--)
          if (a[i] && a[i + 1] && a[i + 2]) {
            ins(i, i + 1, i + 2);
            break;
          }
        for (int i = tmp + 1; i <= tmp + 6; i++)
          if (a[i]) que[++tt] = i;
        ins(que[1] - que[2] + que[1], que[1], que[2]);
      }
    } else if (tcnt) {
      for (int i = tmp + 1; i <= tmp + 6; i++)
        if (a[i]) que[++tt] = i;
      sort(que + 1, que + tt + 1);
      if (tcnt == 1)
        ins(tmp - que[1] + tmp, tmp, que[1]);
      else if (tcnt == 2)
        ins(tmp - que[1] + tmp, tmp, que[1]),
            ins(tmp - que[2] + tmp, tmp, que[2]);
      else if (tcnt == 3) {
        if (que[3] - que[1] == 2)
          ins(que[1], que[2], que[3]);
        else
          ins(que[1] - que[3] + que[1], que[1], que[3]),
              ins(tmp - que[2] + tmp, tmp, que[2]);
      } else {
        if (que[3] - que[1] == 2)
          ins(que[1], que[2], que[3]), ins(tmp - que[4] + tmp, tmp, que[4]);
        else if (que[4] - que[2] == 2)
          ins(que[2], que[3], que[4]), ins(tmp - que[1] + tmp, tmp, que[1]);
        else
          ins(que[1] - que[3] + que[1], que[1], que[3]),
              ins(que[2] - que[4] + que[2], que[2], que[4]);
      }
    }
  }
  int endr = 0;
  for (int i = 1; i <= min(n, 12); i++) endr += a[i] * (1 << i - 1);
  if (!vis[endr]) return 0 * puts("NO");
  puts("YES");
  while (endr != sour) {
    ins(pre[endr].pos, pre[endr].pos + pre[endr].ty,
        pre[endr].pos + 2 * pre[endr].ty);
    endr = pre[endr].lst;
  }
  printf("%d\n", tans);
  for (int i = 1; i <= tans; i++)
    printf("%d %d %d\n", ans[i].x, ans[i].y, ans[i].z);
}
