#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int C = 26;
void add(int &x, int y) {
  x += y;
  while (x >= MOD) x -= MOD;
  while (x < 0) x += MOD;
}
int fix(int x) {
  while (x >= MOD) x -= MOD;
  while (x < 0) x += MOD;
  return x;
}
int pw(int a, int b) {
  int ret = 1;
  while (b) {
    if (b & 1) ret = 1ll * ret * a % MOD;
    b >>= 1;
    a = 1ll * a * a % MOD;
  }
  return ret;
}
const int MAXN = 1e5 + 10;
const int N = 6;
int n, a[MAXN];
vector<pair<int, int> > moves[1 << N];
void go(int start, int cur, vector<pair<int, int> > &vec) {
  if ((int)vec.size() == N / 3) {
    if (cur == 0) {
      moves[start] = vec;
    }
    return;
  }
  for (int i = -N; i < N; i++) {
    for (int len = 1; i + len < N && i - len >= -N; len++) {
      vec.emplace_back(i, len);
      int mask = 0;
      for (int j = -1; j <= 1; j++) {
        int k = i + j * len;
        if (k >= 0) {
          mask ^= 1 << k;
        }
      }
      go(start, cur ^ mask, vec);
      vec.pop_back();
    }
  }
}
vector<pair<int, int> > ans;
void small() {
  for (int mask = 1; mask < (1 << N); mask++) {
    vector<pair<int, int> > cur;
    go(mask, mask, cur);
    assert(!moves[mask].empty());
  }
}
bool rudeBoy(int mask, int rem) {
  if (rem == 0) {
    return mask == 0;
  }
  if (mask == 0) {
    return true;
  }
  for (int i = 0; i < n; i++) {
    for (int l = 1; i + l < n && i - l >= 0; l++) {
      int me = 1 << (i - l) | 1 << i | 1 << (i + l);
      if (rudeBoy(mask ^ me, rem - 1)) {
        ans.emplace_back(i, l);
        return true;
      }
    }
  }
  return false;
}
void show_ans() {
  cout << "YES\n";
  cout << ans.size() << "\n";
  for (auto [i, l] : ans) {
    cout << i - l + 1 << " " << i + 1 << " " << i + l + 1 << "\n";
  }
}
void solve() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
  small();
  int j;
  for (j = n - 1; j - 2 * N + 1 >= 0; j -= N) {
    int l = j - N + 1;
    int mask = 0;
    for (int i = l; i <= j; i++) {
      mask ^= a[i] << (i - l);
    }
    for (auto [ind, len] : moves[mask]) {
      ans.emplace_back(l + ind, len);
      for (int k : {l + ind - len, l + ind, l + ind + len}) {
        a[k] ^= 1;
      }
    }
  }
  n = min(n, 2 * N);
  int mask = 0;
  for (int i = 0; i < n; i++) {
    mask ^= a[i] << i;
  }
  if (!rudeBoy(mask, 2 * N - 4)) {
    cout << "NO\n";
    return;
  }
  show_ans();
}
void rihanna() {
  const int M = 2 * N;
  for (int mask = 0; mask < (1 << M); mask++) {
    n = M;
    assert(rudeBoy(mask, n / 3 + 12));
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int te = 1;
  for (int w = 1; w <= te; w++) {
    solve();
  }
  return 0;
}
