#include <bits/stdc++.h>
using namespace std;
namespace whatever {
int readu() {
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  int value = ch - '0';
  ch = getchar();
  while (isdigit(ch)) {
    value = value * 10 + ch - '0';
    ch = getchar();
  }
  return value;
}
void writeu(int n) {
  if (n < 10)
    putchar(n + '0');
  else {
    writeu(n / 10);
    putchar(n % 10 + '0');
  }
}
pair<vector<int>, vector<int> > bfs(int length, int other_length) {
  vector<int> allowed;
  for (int i = 0; i < length; ++i)
    for (int j = i + 1; j < length; ++j)
      for (int k = j + 1; k < length; ++k)
        if (k - j == j - i) allowed.push_back((1 << i) + (1 << j) + (1 << k));
  cerr << "allowed.size(): " << allowed.size() << endl;
  vector<int> q(1 << length);
  vector<int> dis(1 << length, -1);
  vector<int> path(1 << length);
  int first = 0;
  int last = -1;
  for (int i = 0; i < (1 << other_length); ++i) {
    dis.at(i) = 0;
    q.at(++last) = i;
    path.at(i) = -1;
  }
  int max_dis = 0;
  while (first <= last) {
    int cur = q.at(first++);
    if ((cur & ((1 << other_length) - 1)) == 0) max_dis = dis.at(cur);
    for (int change : allowed) {
      int next = (cur ^ change);
      if (dis[next] == -1) {
        dis.at(next) = dis.at(cur) + 1;
        path.at(next) = cur;
        q.at(++last) = next;
      }
    }
  }
  cerr << "max_dis: " << max_dis << endl;
  return {dis, path};
}
int add(int length, vector<int> &dis, vector<int> &path,
        vector<vector<int> > &result, int cur, int base) {
  assert(dis.at(cur) >= 0);
  if (path.at(cur) == -1) return cur;
  assert(dis.at(path.at(cur)) + 1 == dis.at(cur));
  vector<int> affected;
  for (int i = 0; i < length; ++i)
    if ((path.at(cur) ^ cur) & (1 << i)) affected.push_back(base + i + 1);
  assert(affected.size() == 3);
  result.push_back(affected);
  return add(length, dis, path, result, path.at(cur), base);
}
void print(vector<vector<int> > &result) {
  writeu(result.size());
  putchar('\n');
  for (size_t i = 0; i < result.size(); ++i) {
    writeu(result.at(i).at(0));
    putchar(' ');
    writeu(result.at(i).at(1));
    putchar(' ');
    writeu(result.at(i).at(2));
    putchar('\n');
  }
}
void run() {
  int n = readu();
  static int a[100000];
  for (int i = 0; i < n; ++i) a[i] = readu();
  vector<vector<int> > result;
  pair<vector<int>, vector<int> > bfs_result;
  vector<int> dis;
  vector<int> path;
  if (n < 17) {
    bfs_result = bfs(n, 0);
    dis = bfs_result.first;
    path = bfs_result.second;
    int state = 0;
    for (int i = 0; i < n; ++i)
      if (a[i]) state += (1 << i);
    if (dis[state] == -1) {
      puts("NO");
    } else {
      puts("YES");
      state = add(n, dis, path, result, state, 0);
      assert(state == 0);
      print(result);
    }
  } else {
    puts("YES");
    bfs_result = bfs(12, 3);
    dis = bfs_result.first;
    path = bfs_result.second;
    for (auto value : dis) assert(value >= 0);
    while (n >= 17) {
      int state = 0;
      for (int i = 0; i < 12; ++i)
        if (a[n - 12 + i]) state += (1 << i);
      state = add(12, dis, path, result, state, n - 12);
      assert(state == (state & ((1 << 3) - 1)));
      for (int i = 0; i < 3; ++i)
        if (state & (1 << i))
          a[n - 12 + i] = 1;
        else
          a[n - 12 + i] = 0;
      n -= 9;
    }
    bfs_result = bfs(n, 0);
    dis = bfs_result.first;
    path = bfs_result.second;
    for (auto value : dis) assert(value >= 0);
    int state = 0;
    for (int i = 0; i < n; ++i)
      if (a[i]) state += (1 << i);
    state = add(n, dis, path, result, state, 0);
    assert(state == 0);
    print(result);
  }
}
}  // namespace whatever
int main() { whatever::run(); }
