#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);   }