#include <bits/stdc++.h>
using namespace std;
string to_string(string s) { return '"' + s + '"'; }
string to_string(const char* s) { return to_string((string)s); }
string to_string(bool b) { return (b ? "true" : "false"); }
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto& x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}
void debug_out() { cerr << '\n'; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
int x[100005];
vector<tuple<int, int, int>> res;
int n;
void brute(int l, int r) {
  n = min(n, 8);
  int diff = n - (r - l + 1);
  l -= diff;
  if (l < 0) r -= l, l = 0;
  int mask = 0;
  for (int i = 0; i < r - l + 1; i++) {
    mask |= (x[i + l] << i);
  }
  n = min(n, 8);
  vector<int> par(1 << n, -1);
  queue<int> q;
  q.push(0);
  par[0] = -2;
  while (!q.empty()) {
    auto cur = q.front();
    q.pop();
    for (int j = 0; j < n; j++) {
      for (int d = 1; d < n; d++) {
        if (j + 2 * d < n) {
          if (par[cur ^ (1 << j) ^ (1 << (j + d)) ^ (1 << (j + 2 * d))] == -1) {
            par[cur ^ (1 << j) ^ (1 << (j + d)) ^ (1 << (j + 2 * d))] = cur;
            q.push(cur ^ (1 << j) ^ (1 << (j + d)) ^ (1 << (j + 2 * d)));
          }
        }
      }
    }
  }
  if (par[mask] == -1) {
    cout << "NO";
    exit(0);
  }
  while (mask) {
    vector<int> alpha;
    auto temp = par[mask] ^ mask;
    for (int i = 0; i < n; i++) {
      if (temp & (1 << i)) {
        alpha.push_back(i + l);
      }
    }
    res.push_back({alpha[0], alpha[1], alpha[2]});
    mask = par[mask];
  }
  return;
}
void solver(int l, int r) {
  if (r - l + 1 < 9) {
    brute(l, r);
    return;
  }
  if (x[l] and x[l + 1] and x[l + 2] == 0) {
    if (x[r] and x[r - 1] and x[r - 2] == 0) {
      if ((l + r) % 2) {
        x[l] ^= 1;
        x[r - 1] ^= 1;
        x[(l + r - 1) / 2] ^= 1;
        res.push_back({l, (l + r - 1) / 2, r - 1});
        x[l + 1] ^= 1;
        x[r] ^= 1;
        x[(l + r + 1) / 2] ^= 1;
        res.push_back({l + 1, (l + r + 1) / 2, r});
        solver(l + 3, r - 3);
      } else {
        x[l] ^= 1;
        x[r] ^= 1;
        x[(l + r) / 2] ^= 1;
        res.push_back({l, (l + r) / 2, r});
        x[l + 1] ^= 1;
        x[r - 1] ^= 1;
        x[(l + r) / 2] ^= 1;
        res.push_back({l + 1, (l + r) / 2, r - 1});
        solver(l + 3, r - 3);
      }
      return;
    } else {
      int i = r;
      while (x[i] == 0 and i > r - 3) i--;
      if (i == r - 3) {
        solver(l, i);
        return;
      } else {
        int j = i - 1;
        while (x[j] == 0 and j > l - 3) j--;
        x[i] ^= 1;
        x[j] ^= 1;
        x[2 * j - i] ^= 1;
        res.push_back({i, j, 2 * j - i});
        solver(l, r - 3);
        return;
      }
    }
  } else {
    int i = l;
    while (x[i] == 0 and i < l + 3) i++;
    if (i == l + 3) {
      solver(i, r);
      return;
    } else {
      int j = i + 1;
      while (x[j] == 0 and j < l + 3) j++;
      x[i] ^= 1;
      x[j] ^= 1;
      x[2 * j - i] ^= 1;
      res.push_back({i, j, 2 * j - i});
      solver(l + 3, r);
      return;
    }
  }
}
void solve() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> x[i];
  solver(0, n - 1);
  cout << "YES\n";
  cout << (int)res.size() << '\n';
  for (auto i : res) {
    cout << get<0>(i) + 1 << " " << get<1>(i) + 1 << " " << get<2>(i) + 1
         << '\n';
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
