#include <bits/stdc++.h>
using namespace std;
const int M = 2e5 + 10;
struct ope {
  int x, y, z;
  ope() {}
  ope(int a, int b, int c) : x(a), y(b), z(c) {}
  void out() { printf("%d %d %d\n", x, y, z); }
} ans[M], op[101];
int top, bit[M];
int n, A[M], ls[M];
void add(int a, int b, int c) { ans[++top] = ope(a, b, c); }
void add(ope a) { ans[++top] = a; }
bool check(int p, int p1, int p2, int p3, int d = 1) {
  if (A[p] == p1 && A[p + d] == p2 && A[p + (d * 2)] == p3) return 1;
  return 0;
}
void flip(int *ar, int a, int b, int c, int type = 0) {
  ar[a] ^= 1;
  ar[b] ^= 1;
  ar[c] ^= 1;
  if (type) add(a, b, c);
}
bool hadans;
void find(int l, int r) {
  int sz = 0;
  for (int i = l; i <= r; i++) {
    for (int j = i + 2; j <= r; j += 2) {
      op[sz++] = ope(i, (i + j) >> 1, j);
    }
  }
  int minans = M, pos;
  for (int i = 0, up = (1 << sz), wc; i < up; i++) {
    for (int j = l; j <= r; j++) ls[j] = A[j];
    wc = 0;
    for (int j = i, p; j; j -= ((j) & (-(j)))) {
      p = bit[((j) & (-(j)))];
      ++wc;
      flip(ls, op[p].x, op[p].y, op[p].z);
    }
    bool flag = 0;
    for (int j = l; j <= r; j++)
      if (ls[j]) {
        flag = 1;
        break;
      }
    if (!flag) {
      hadans = 1;
      if (wc < minans) minans = wc, pos = i;
    }
  }
  if (hadans) {
    for (int j = pos, p; j; j -= ((j) & (-(j)))) {
      p = bit[((j) & (-(j)))];
      add(op[p]);
    }
  }
}
void solve(int l, int r) {
  if (r - l + 1 <= 8) {
    while (r - l + 1 < 8 && l > 1) --l;
    while (r - l + 1 < 8 && r < n) ++r;
    find(l, r);
    return;
  }
  if (!A[l]) {
    solve(l + 1, r);
    return;
  }
  if (!A[r]) {
    solve(l, r - 1);
    return;
  }
  if (check(l, 1, 1, 1)) {
    flip(A, l, l + 1, l + 2, 1);
    solve(l + 3, r);
    return;
  }
  if (check(l, 1, 0, 1)) {
    flip(A, l, l + 2, l + 4, 1);
    solve(l + 3, r);
    return;
  }
  if (check(l, 1, 0, 0)) {
    flip(A, l, l + 3, l + 6, 1);
    solve(l + 3, r);
    return;
  }
  if (check(r, 1, 1, 1, -1)) {
    flip(A, r, r - 1, r - 2, 1);
    solve(l, r - 3);
    return;
  }
  if (check(r, 1, 0, 1, -1)) {
    flip(A, r, r - 2, r - 4, 1);
    solve(l, r - 3);
    return;
  }
  if (check(r, 1, 0, 0, -1)) {
    flip(A, r, r - 3, r - 6, 1);
    solve(l, r - 3);
    return;
  }
  if ((r - l + 1) & 1) {
    flip(A, l, (l + r) >> 1, r, 1);
    flip(A, l + 1, (l + r) >> 1, r - 1, 1);
    solve(l + 3, r - 3);
  } else {
    flip(A, l, (l + r - 1) >> 1, r - 1, 1);
    flip(A, l + 1, (l + r + 1) >> 1, r, 1);
    solve(l + 3, r - 3);
  }
}
void init() {
  for (int i = 0; i <= 17; i++) bit[1 << i] = i;
}
int main() {
  init();
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
  solve(1, n);
  if (hadans) {
    puts("YES");
    printf("%d\n", top);
    for (int i = 1; i <= top; i++) ans[i].out();
  } else
    puts("NO");
  return 0;
}
