#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3fffffff;
const int SINF = 0x7fffffff;
const long long LINF = 0x3fffffffffffffff;
const long long SLINF = 0x7fffffffffffffff;
const int MAXN = 100007;
struct aT {
  aT(int _x = 0, int _y = 0, int _z = 0) : x(_x), y(_y), z(_z) {}
  int x, y, z;
};
int n;
pair<pair<int, int>, pair<int, int> > md[(1 << 6) + 7];
int ia[MAXN], a[MAXN];
vector<aT> ans;
void init();
void input();
void work();
void flip(int x, int y, int z) {
  ans.push_back(aT(x, y, z));
  a[x] ^= 1;
  a[y] ^= 1;
  a[z] ^= 1;
}
void flip(int x, int d) {
  if (d > 0)
    flip(x, x + d, x + d + d);
  else
    flip(x + d + d, x + d, x);
}
int main() {
  init();
  input();
  work();
}
void init() {
  ios::sync_with_stdio(false);
  bool flag;
  for (int i = 0; i < (1 << 6); ++i) {
    flag = false;
    for (int a1 = 1; a1 <= 6; ++a1) {
      for (int d1 = 1; d1 <= 6; ++d1) {
        for (int a2 = 1; a2 <= 6; ++a2) {
          for (int d2 = 1; d2 <= 6; ++d2) {
            if (a1 + d1 + d1 <= 11 && a2 + d2 + d2 <= 11) {
              for (int j = 1; j <= 6; ++j) a[j] = i >> (6 - j) & 1;
              flip(a1, d1);
              flip(a2, d2);
              if (*max_element(a + 1, a + 7) == 0) {
                flag = true;
                md[i] = make_pair(make_pair(a1, d1), make_pair(a2, d2));
                break;
              }
            }
          }
          if (flag) break;
        }
        if (flag) break;
      }
      if (flag) break;
    }
    if (!flag) cerr << "Error : " << i << endl;
  }
}
void input() {
  memset(a, 0, sizeof(a));
  ans.clear();
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
}
void work() {
  if (n <= 7) {
    for (int i = 1; i <= n; ++i) ia[i] = a[i];
    for (int i = 1; i <= n - 2; ++i)
      if (a[i]) flip(i, 1);
    if (*max_element(a + 1, a + 1 + n) == 0) {
      printf("YES\n");
      printf("%d\n", static_cast<int>(ans.size()));
      for (auto x : ans) printf("%d %d %d\n", x.x, x.y, x.z);
    } else if (n == 7) {
      for (int i = 1; i <= n; ++i) a[i] = ia[i];
      ans.clear();
      flip(1, 3);
      for (int i = 1; i <= n - 2; ++i)
        if (a[i]) flip(i, 1);
      if (*max_element(a + 1, a + 1 + n) == 0) {
        printf("YES\n");
        printf("%d\n", static_cast<int>(ans.size()));
        for (auto x : ans) printf("%d %d %d\n", x.x, x.y, x.z);
      } else
        printf("NO\n");
    } else
      printf("NO\n");
    return;
  }
  int i;
  for (i = 1; i <= n - 10; i += 6) {
    int ns = 0;
    for (int j = 0; j < 6; ++j) ns |= a[i + j] << (5 - j);
    flip(i + md[ns].first.first - 1, md[ns].first.second);
    flip(i + md[ns].second.first - 1, md[ns].second.second);
  }
  for (; i <= n - 2; ++i)
    if (a[i]) flip(i, 1);
  if (a[n]) {
    flip(n, -3);
    flip(n - 3, -1);
    flip(n - 4, -1);
  }
  if (a[n - 1]) {
    flip(n - 1, -3);
    flip(n - 4, -1);
    flip(n - 5, -1);
  }
  printf("YES\n");
  printf("%d\n", static_cast<int>(ans.size()));
  for (auto x : ans) printf("%d %d %d\n", x.x, x.y, x.z);
}
