#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int dis[N], pre[N], n, a[N];
void bruce(int n, int S) {
  vector<int> E;
  for (int d = (1); d < (n); ++d) {
    for (int m = (0); m < (n); ++m) {
      if (m - d < 0) continue;
      if (m + d >= n) continue;
      E.push_back((1ll << (m)) | (1ll << (m - d)) | (1ll << (m + d)));
    }
  }
  fill_n(dis, (1ll << (n)), INT_MAX);
  dis[S] = 0;
  queue<int> que;
  que.push(S);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (auto e : E) {
      int v = u ^ e;
      if (dis[v] < INT_MAX) continue;
      dis[v] = dis[u] + 1;
      pre[v] = e;
      que.push(v);
    }
  }
}
vector<tuple<int, int, int> > ans;
void gao(int p1, int p2, int p3) {
  ans.push_back({p1, p2, p3});
  a[p1] ^= 1, a[p2] ^= 1, a[p3] ^= 1;
}
void gao(int pv) {
  int p[3];
  for (int i = (0); i < (3); ++i) {
    p[i] = __builtin_ctz(pv);
    pv -= pv & -pv;
  }
  gao(p[2], p[1], p[0]);
}
void solve() {
  int n;
  cin >> n;
  int _n = n;
  for (int i = (0); i < (n); ++i) cin >> a[i];
  const int lim = 12;
  while (n >= lim) {
    int val = (a[n - 3] << 2) | (a[n - 2] << 1) | (a[n - 1] << 0);
    if (val == 0)
      ;
    else if (val == 1)
      gao(n - 1, n - 4, n - 7);
    else if (val == 2)
      gao(n - 2, n - 4, n - 6);
    else if (val == 3) {
      if (n - 6 < 8) break;
      int pre = (a[n - 6] << 2) | (a[n - 5] << 1) | (a[n - 4] << 0);
      if (pre == 0) {
        gao(n - 1, n - 2, n - 3);
        gao(n - 3, n - 7, n - 11);
      } else if (pre == 1) {
        gao(n - 1, n - 4, n - 7);
        gao(n - 2, n - 7, n - 12);
      } else if (pre == 2) {
        gao(n - 1, n - 5, n - 9);
        gao(n - 2, n - 7, n - 12);
      } else if (pre == 3) {
        gao(n - 1, n - 3, n - 5);
        gao(n - 2, n - 3, n - 4);
      } else if (pre == 4) {
        gao(n - 2, n - 4, n - 6);
        gao(n - 1, n - 4, n - 7);
      } else if (pre == 5) {
        gao(n - 1, n - 4, n - 7);
        gao(n - 2, n - 6, n - 10);
      } else if (pre == 6) {
        gao(n - 1, n - 5, n - 9);
        gao(n - 2, n - 6, n - 10);
      } else if (pre == 7) {
        gao(n - 2, n - 4, n - 6);
        gao(n - 1, n - 5, n - 9);
      } else
        assert(false);
    } else if (val == 4)
      gao(n - 3, n - 4, n - 5);
    else if (val == 5)
      gao(n - 1, n - 3, n - 5);
    else if (val == 6)
      gao(n - 2, n - 3, n - 4);
    else
      gao(n - 1, n - 2, n - 3);
    n -= 3;
  }
  int S = 0;
  for (int i = (0); i < (n); ++i) S |= a[i] << i;
  bruce(n, S);
  if (dis[0] == INT_MAX) {
    cout << "NO";
    return;
  } else {
    for (int i = 0; i != S; i ^= pre[i]) gao(pre[i]);
    assert(*max_element(a, a + _n) == 0);
    cout << "YES"
         << "\n";
    cout << ((int)(ans).size()) << "\n";
    for (int i = (0); i < (((int)(ans).size())); ++i) {
      int p1, p2, p3;
      tie(p1, p2, p3) = ans[i];
      cout << p1 + 1 << " " << p2 + 1 << " " << p3 + 1 << "\n";
    }
  }
}
int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  solve();
  return 0;
}
