#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y, z;
  node() {}
  node(int a, int b, int c) : x(a), y(b), z(c) {}
  node operator+(const node &a) const {
    return node(x + a.x, y + a.y, z + a.z);
  }
  node operator-(const node &a) const {
    return node(x - a.x, y - a.y, z - a.z);
  }
  void out() { printf("%d %d %d\n", x, y, z); }
};
vector<node> ans;
int a[100000 + 5];
int b[100000 + 5];
int backup[100000 + 5], bn;
bool check(int n) {
  for (int i = 1; i <= n; i++)
    if (a[i] != b[i]) return 0;
  return 1;
}
void put(int a[], node nn) {
  a[nn.x] ^= 1;
  a[nn.y] ^= 1;
  a[nn.z] ^= 1;
}
void CK(int n) {
  for (int i = 1; i <= n; i++) a[i] = 0;
  for (auto e : ans) put(a, e);
  for (int i = 1; i <= n; i++) assert(a[i] == backup[i]);
}
void bf(int n) {
  node w[20];
  int cnt = 0;
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      if (j * 2 - i <= n) w[++cnt] = node(i, j, j * 2 - i);
    }
  int N = 1 << cnt;
  for (int t = 0; t <= N - 1; t++) {
    for (int i = 1; i <= n; i++) b[i] = 0;
    for (int i = 1; i <= cnt; i++)
      if (t & (1 << (i - 1))) put(b, w[i]);
    if (check(n)) {
      puts("YES");
      for (int i = 1; i <= cnt; i++)
        if (t & (1 << (i - 1))) ans.push_back(w[i]);
      printf("%d\n", (int)ans.size());
      for (auto e : ans) e.out();
      CK(n);
      return;
    }
  }
  puts("NO");
}
vector<node> w[(1 << 6) + 5];
int mark[(1 << 6) + 5];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) backup[i] = a[i];
  bn = n;
  if (n <= 7)
    bf(n);
  else {
    vector<node> tmp;
    tmp.push_back(node(0, 0, 0));
    for (int y = 0; y <= 5; y++)
      for (int z = y + 1; z <= 6; z++) tmp.push_back(node(y * 2 - z, y, z));
    for (auto it1 : tmp)
      for (auto it2 : tmp) {
        for (int i = 1; i <= 6; i++) b[20 + i] = 0;
        put(b + 20, it1);
        put(b + 20, it2);
        int x = 0;
        for (int i = 0; i <= 5; i++) x += b[21 + i] << i;
        if (mark[x] == 0) {
          mark[x] = 1;
          if (it1.z) w[x].push_back(it1);
          if (it2.z) w[x].push_back(it2);
        }
      }
    while (n >= 13) {
      n -= 6;
      int x = 0;
      for (int i = 0; i <= 5; i++) x += a[n + 1 + i] << i;
      for (auto e : w[x]) put(a + n, e);
      for (auto e : w[x]) ans.push_back(e + node(n, n, n));
    }
    node B(-2, -1, 0);
    while (n > 2) {
      if (a[n]) {
        put(a + n, B);
        ans.push_back(node(n, n, n) + B);
      }
      n--;
    }
    node C[3];
    C[0] = node(0, 3, 6);
    C[1] = node(3, 4, 5);
    C[2] = node(4, 5, 6);
    if (a[2])
      for (int i = 0; i <= 2; i++)
        put(a + 2, C[i]), ans.push_back(node(2, 2, 2) + C[i]);
    if (a[1])
      for (int i = 0; i <= 2; i++)
        put(a + 1, C[i]), ans.push_back(node(1, 1, 1) + C[i]);
    puts("YES");
    printf("%u\n", ans.size());
    for (auto e : ans) e.out();
    CK(bn);
  }
  return 0;
}
