#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const long long LL_INF = 1ll * INF * INF;
const int MAX_N = 100000 + 7;
template <typename T>
inline void addmod(T& a, const long long& b, const int& MOD = INF) {
  a = (a + b) % MOD;
  if (a < 0) a += MOD;
}
const int M = 12;
struct Node {
  int left, mid, right;
};
bool bfs(bitset<M> start, bitset<M> stop, vector<Node>& ans, int mx_len) {
  unordered_map<bitset<M>, Node> all;
  queue<bitset<M> > queue_;
  queue_.push(start);
  all[start] = {-1};
  while (!queue_.empty()) {
    auto u = queue_.front();
    queue_.pop();
    for (int j = 0; j < mx_len; ++j)
      for (int mid = j + 1; mid < mx_len; ++mid) {
        if (2 * mid - j < mx_len) {
          auto tmp = u;
          tmp.flip(j);
          tmp.flip(mid);
          tmp.flip(2 * mid - j);
          if (!all.count(tmp)) {
            all[tmp] = {j, mid, 2 * mid - j};
            queue_.push(tmp);
          }
        } else
          break;
      }
  }
  if (all.count(stop)) {
    while (stop != start) {
      Node last = all[stop];
      ans.push_back(last);
      stop.flip(last.left);
      stop.flip(last.mid);
      stop.flip(last.right);
    }
  }
  return all.count(stop);
}
int n;
int a[MAX_N];
void flip(int i) { a[i] ^= 1; }
vector<Node> ans;
void change(int v, int k) {
  int u = 2 * v - k;
  assert(u >= 0);
  flip(u);
  flip(v);
  flip(k);
  ans.push_back({u, v, k});
}
void solve() {
  cin >> n;
  for (int i = (0), _b = (n); i < _b; ++i) {
    cin >> a[i];
  }
  int old_n = min(n, 12);
  while (n > 12) {
    if (a[n - 1] == 0) {
      --n;
      continue;
    }
    int u = n - 3, v = n - 2, k = n - 1;
    if (a[u] == 1 && a[v] == 1) {
      change(v, k);
      n -= 3;
    } else if (a[u] == 0 && a[v] == 0) {
      change(n - 4, n - 1);
      n -= 3;
    } else if (a[u] == 1 && a[v] == 0) {
      change(n - 3, n - 1);
      n -= 3;
    } else {
      vector<int> ids;
      for (int i = n - 6; i <= n - 4; ++i)
        if (a[i]) ids.push_back(i);
      if (ids.size() == 3) {
        change(n - 4, n - 2);
        change(n - 5, n - 1);
      } else if (ids.size() == 2) {
        change(ids[0], n - 2);
        change(ids[1], n - 1);
      } else if (ids.size() == 1) {
        change(ids[0], n - 1);
        change(n - 7, n - 2);
      } else {
        change(n - 7, n - 1);
        change(n - 7, n - 2);
      }
      n -= 6;
    }
  }
  cerr << "n"
       << ": " << (n) << '\n';
  ;
  bitset<M> stop;
  for (int j = 0; j < n; ++j) stop.set(j, a[j]);
  cerr << "stop"
       << ": " << (stop) << '\n';
  ;
  if (!bfs(bitset<M>(0), stop, ans, old_n)) {
    cout << "NO";
  } else {
    cout << "YES\n";
    cout << ans.size() << '\n';
    for (auto node : ans) {
      cout << node.left + 1 << ' ' << node.mid + 1 << ' ' << node.right + 1
           << '\n';
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  const bool multiple_test = false;
  int test = 1;
  if (multiple_test) cin >> test;
  for (int i = 0; i < test; ++i) {
    solve();
  }
}
