#include <bits/stdc++.h>
using namespace std;
struct Node {
  int x, d;
};
struct Node2 {
  vector<Node> op;
  int st;
};
struct Node3 {
  int pos, x, d;
  void print() { printf("%d %d %d\n", pos + x - d, pos + x, pos + x + d); }
};
const int N = 3e5 + 10;
vector<Node> rec[N];
vector<Node> rec2[N];
vector<Node3> ans;
int a[N];
queue<Node2> q;
int encode(int x, int len = 9) {
  int sum = 0;
  for (int i = 0; i < len; i++) sum += a[x + i] * (1 << i);
  return sum;
}
void bfs1(int n) {
  Node2 temp;
  temp.op.clear();
  temp.st = 0;
  q.push(temp);
  while (!q.empty()) {
    temp = q.front();
    q.pop();
    for (int i = 1; i < n - 1; i++) {
      for (int j = 1, st; j <= i; j++) {
        if (i + j >= n) continue;
        st = temp.st;
        temp.st ^= ((1 << (i - j)) ^ (1 << i) ^ (1 << (i + j)));
        temp.op.push_back((Node){i, j});
        if (temp.st != 0 && rec[temp.st].empty()) {
          rec[temp.st] = temp.op;
          q.push(temp);
        }
        temp.op.pop_back();
        temp.st = st;
      }
    }
  }
}
void bfs2() {
  Node2 temp;
  while (!q.empty()) q.pop();
  temp.op.clear();
  temp.st = 0;
  q.push(temp);
  while (!q.empty()) {
    temp = q.front();
    q.pop();
    for (int i = 1; i <= 9; i++) {
      for (int j = 1, st; j <= i; j++) {
        st = temp.st;
        temp.st ^= (1 << (i - j));
        if (i < 9) temp.st ^= (1 << i);
        if (i + j < 9) temp.st ^= (1 << (i + j));
        temp.op.push_back((Node){i, j});
        if (temp.st != 0 && rec2[temp.st].empty()) {
          rec2[temp.st] = temp.op;
          q.push(temp);
        }
        temp.op.pop_back();
        temp.st = st;
      }
    }
  }
}
int main() {
  int n, num, now;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  if (n <= 18) {
    bfs1(n);
    num = encode(0, n);
    if (num == 0) {
      printf("YES\n");
      printf("0\n");
    } else {
      if ((int)rec[num].size()) {
        printf("YES\n");
        printf("%d\n", (int)rec[num].size());
        for (auto it : rec[num]) ans.push_back((Node3){1, it.x, it.d});
        for (auto it : ans) it.print();
      } else
        printf("NO\n");
    }
  } else {
    bfs2();
    for (int i = 0; n - i > 18; i += 9) {
      num = encode(i, 9);
      for (auto it : rec2[num]) {
        ans.push_back((Node3){i + 1, it.x, it.d});
        a[i + it.x - it.d] ^= 1;
        a[i + it.x] ^= 1;
        a[i + it.x + it.d] ^= 1;
      }
    }
    bfs1((n - 1) % 9 + 10);
    num = encode(n - (n - 1) % 9 - 10, (n - 1) % 9 + 10);
    for (auto it : rec[num])
      ans.push_back((Node3){n - (n - 1) % 9 - 9, it.x, it.d});
    printf("YES\n");
    printf("%d\n", (int)ans.size());
    for (auto it : ans) it.print();
  }
  return 0;
}
