#include <bits/stdc++.h>   using namespace std;   mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());   mt19937 rnf(2106);   const int N = 100005;   bool c[(1 << 22)];   int d[(1 << 22)];   int p[(1 << 22)];   void solv0(int n) {     vector<int> v;     for (int x = 0; x < n; ++x) {       for (int y = x + 1; y < n; ++y) {         for (int z = y + 1; z < n; ++z) {           if (y - x == z - y) {             v.push_back(((1 << x) | (1 << y) | (1 << z)));           }         }       }     }     for (int x = 0; x < (1 << n); ++x) c[x] = false;     queue<int> q;     c[0] = true;     d[0] = 0;     q.push(0);     while (!q.empty()) {       int x = q.front();       q.pop();       for (int i = 0; i < ((int)(v).size()); ++i) {         int h = (x ^ v[i]);         if (!c[h]) {           c[h] = true;           d[h] = d[x] + 1;           p[h] = v[i];           q.push(h);         }       }     }     return;     for (int x = 0; x < (1 << n); ++x) {       if (!c[x]) {         for (int i = 0; i < n; ++i) {           if ((x & (1 << i)))             cout <<  1 ;           else             cout <<  0 ;         }         cout << endl;       }     }     int maxu = 0;     for (int x = 0; x < (1 << n); ++x) {       if (!c[x]) continue;       maxu = max(maxu, d[x]);     }     cout << maxu <<   n ;     for (int x = 0; x < (1 << n); ++x) {       if (!c[x]) continue;       if (maxu == d[x]) {         for (int i = 0; i < n; ++i) {           if ((x & (1 << i)))             cout <<  1 ;           else             cout <<  0 ;         }         cout << endl;         cout << endl;         while (x) {           for (int i = 0; i < n; ++i) {             if ((p[x] & (1 << i)))               cout <<  1 ;             else               cout <<  0 ;           }           cout << endl;           x ^= p[x];         }         return;       }     }   }   void solv6() {     int n = 6;     vector<int> v;     for (int x = 0; x < n; ++x) {       for (int y = x + 1; y < n; ++y) {         for (int z = y + 1; z < n; ++z) {           if (y - x == z - y) {             v.push_back(((1 << x) | (1 << y) | (1 << z)));           }         }         if (x - (y - x) < 0) v.push_back(((1 << x) | (1 << y)));       }       v.push_back((1 << x));     }     for (int x = 0; x < (1 << n); ++x) c[x] = false;     queue<int> q;     c[0] = true;     d[0] = 0;     q.push(0);     while (!q.empty()) {       int x = q.front();       q.pop();       for (int i = 0; i < ((int)(v).size()); ++i) {         int h = (x ^ v[i]);         if (!c[h]) {           c[h] = true;           d[h] = d[x] + 1;           p[h] = v[i];           q.push(h);         }       }     }     return;     for (int x = 0; x < (1 << n); ++x) {       if (!c[x]) {         for (int i = 0; i < n; ++i) {           if ((x & (1 << i)))             cout <<  1 ;           else             cout <<  0 ;         }         cout << endl;       }     }     int maxu = 0;     for (int x = 0; x < (1 << n); ++x) {       if (!c[x]) continue;       maxu = max(maxu, d[x]);     }     cout << maxu <<   n ;     for (int x = 0; x < (1 << n); ++x) {       if (!c[x]) continue;       if (maxu == d[x]) {         for (int i = 0; i < n; ++i) {           if ((x & (1 << i)))             cout <<  1 ;           else             cout <<  0 ;         }         cout << endl;         cout << endl;         while (x) {           for (int i = 0; i < n; ++i) {             if ((p[x] & (1 << i)))               cout <<  1 ;             else               cout <<  0 ;           }           cout << endl;           x ^= p[x];         }         return;       }     }   }   int n;   int a[N];   vector<tuple<int, int, int> > ans;   void ubd(int x, int y, int z) {     assert(x >= 1 && x <= n && y >= 1 && y <= n && z >= 1 && z <= n);     assert(x < y && y < z && (y - x) == (z - y));     ans.push_back(tie(x, y, z));     a[x] ^= 1;     a[y] ^= 1;     a[z] ^= 1;   }   void solv() {     cin >> n;     for (int i = 1; i <= n; ++i) cin >> a[i];     solv6();     while (n >= 14) {       int x = 0;       for (int i = n - 5; i <= n; ++i) {         x += (a[i] * (1 << (i - (n - 5))));       }       while (x) {         vector<int> v;         for (int i = 0; i < 6; ++i) {           if ((p[x] & (1 << i))) v.push_back(n - 5 + i);         }         if (((int)(v).size()) == 3)           ubd(v[0], v[1], v[2]);         else if (((int)(v).size()) == 2)           ubd(v[0] - (v[1] - v[0]), v[0], v[1]);         else           ubd(n - 6 - (v[0] - (n - 6)), n - 6, v[0]);         x ^= p[x];       }       n -= 6;     }     solv0(n);     int x = 0;     for (int i = 1; i <= n; ++i) x += (a[i] * (1 << (i - 1)));     if (!c[x]) {       cout <<  NO n ;       return;     }     while (x) {       vector<int> v;       for (int i = 0; i < n; ++i) {         if ((p[x] & (1 << i))) v.push_back(i + 1);       }       ubd(v[0], v[1], v[2]);       x ^= p[x];     }     for (int i = 1; i <= n; ++i) assert(!a[i]);     cout <<  YES n ;     cout << ((int)(ans).size()) <<   n ;     for (int i = 0; i < ((int)(ans).size()); ++i)       cout << get<0>(ans[i]) <<     << get<1>(ans[i]) <<     << get<2>(ans[i])            <<   n ;   }   int main() {     ios_base::sync_with_stdio(false), cin.tie(0);     int tt = 1;     while (tt--) {       solv();     }     return 0;   }