#include <bits/stdc++.h>
using namespace std;
int str[100010];
int vis[100010];
struct A {
  int x, y, z;
  A(int x_ = 0, int y_ = 0, int z_ = 0) : x(x_), y(y_), z(z_) {}
};
struct B {
  int x;
  B(int x_ = 0) : x(x_) {}
  friend int operator<(B a, B b) { return a.x > b.x; }
};
priority_queue<B> qn;
queue<A> ans;
int main() {
  int n;
  while (cin >> n) {
    int j, cnt = 0;
    ;
    for (int i = 1; i <= n; ++i) vis[i] = 0;
    for (int i = 1; i <= n; ++i) {
      cin >> str[i];
      if (str[i] == 1) {
        qn.push(i);
        vis[i] = 1;
      }
    }
    int ok = 1;
    int mm = n / 3 + 12;
    while (!qn.empty() && ans.size() <= mm) {
      while (!qn.empty() && vis[qn.top().x] == 0) qn.pop();
      if (qn.empty()) break;
      int x = qn.top().x;
      qn.pop(), vis[x] = 0;
      while (!qn.empty() && vis[qn.top().x] == 0) qn.pop();
      if (qn.empty()) {
        if (x - 1 >= 6) {
          ans.push(A(x - 6, x - 3, x));
          ans.push(A(x - 5, x - 4, x - 3));
          ans.push(A(x - 6, x - 5, x - 4));
          break;
        } else if (n - x >= 6) {
          ans.push(A(x, x + 3, x + 6));
          ans.push(A(x + 3, x + 4, x + 5));
          ans.push(A(x + 4, x + 5, x + 6));
          break;
        } else if (n - x >= 2) {
          int res = (n - x) / 2;
          qn.push(B(x + res));
          qn.push(B(x + res + res));
          ans.push(A(x, x + res, x + res + res));
          vis[x + res] = 1;
          vis[x + res + res] = 1;
          continue;
        } else {
          ok = 0;
          break;
        }
      }
      while (!qn.empty() && vis[qn.top().x] == 0) qn.pop();
      if (qn.empty()) break;
      int y = qn.top().x;
      qn.pop(), vis[y] = 0;
      int z = 2 * y - x;
      int d = z - y;
      while (!qn.empty() && vis[qn.top().x] == 0) qn.pop();
      if (z <= n) {
        if (vis[z] == 0) {
          if (d != 1 || qn.empty()) {
            qn.push(B(z));
            vis[z] = 1;
            ans.push(A(x, y, z));
          } else {
            z = qn.top().x, qn.pop(), vis[z] = 0;
            qn.push(B(x)), vis[x] = 1;
            int z2 = 2 * z - y;
            if (z2 <= n) {
              if (vis[z2] == 0) {
                vis[z2] = 1;
                qn.push(B(z2));
              } else
                vis[z2] = 0;
              ans.push(A(y, z, z2));
            } else {
              if ((z + y) % 2 == 0) {
                qn.push(B((z + y) / 2));
                vis[(z + y) / 2] = 1;
                ans.push(A(y, (y + z) / 2, z));
              } else {
                int rem = (z - y - 1) / 2;
                qn.push(B(z)), vis[z] = 1;
                qn.push(B(y + rem)), vis[y + rem] = 1;
                qn.push(B(y + rem + rem)), vis[y + rem + rem] = 1;
                ans.push(A(y, y + rem, y + rem + rem));
              }
            }
          }
        } else
          vis[z] = 0, ans.push(A(x, y, z));
      } else {
        if (y - x >= 2) {
          if ((x + y) % 2 == 0)
            qn.push(B((x + y) / 2)),
                vis[(x + y) / 2] = 1, ans.push(A(x, (x + y) / 2, y));
          else {
            int res = (y - x - 1) / 2;
            qn.push(B(x + res)), vis[x + res] = 1;
            qn.push(B(x + res + res)), vis[x + res + res] = 1;
            qn.push(B(y)), vis[y] = 1;
            ans.push(A(x, x + res, x + res + res));
          }
        } else {
          if (x - 1 >= 6) {
            ans.push(A(x - 6, x - 3, x));
            ans.push(A(x - 5, x - 4, x - 3));
            ans.push(A(x - 6, x - 5, x - 4));
            qn.push(B(y));
            vis[y] = 1;
          } else {
            ok = 0;
            break;
          }
        }
      }
      ++cnt;
      while (!qn.empty() && vis[qn.top().x] == 0) qn.pop();
      if (qn.empty()) break;
    }
    if (ans.size() > mm) ok = 0;
    if (ok) {
      printf("YES\n");
      printf("%d\n", ans.size());
      while (!ans.empty()) {
        A p = ans.front();
        ans.pop();
        printf("%d %d %d\n", p.x, p.y, p.z);
      }
    } else
      printf("NO\n");
    while (!qn.empty()) qn.pop();
    while (!ans.empty()) ans.pop();
  }
  return 0;
}
