#include <bits/stdc++.h>
using namespace std;
const int M = 1e6 + 5, INF = 0x3f3f3f3f;
struct node {
  int a, b, c;
};
int A[M];
int dp[M];
node trip[M], trip1[M];
void dfs1(int x, int n) {
  for (int j = 0; j < n; j++) {
    for (int k = j + 1; k < n; k++) {
      for (int i = k + 1; i < n; i++) {
        if (i - k != k - j) continue;
        int y = x ^ (1 << j) ^ (1 << k) ^ (1 << i);
        if (dp[y] > dp[x] + 1) {
          dp[y] = dp[x] + 1;
          trip[y] = {j, k, i};
          dfs1(y, n);
        }
      }
    }
  }
  for (int j = 0; j < n; j++) {
    for (int k = j + 1; k < n; k++) {
      if (k + k - j < 2 * n && k + k - j >= n) {
        int y = x ^ (1 << j) ^ (1 << k);
        if (dp[y] > dp[x] + 1) {
          dp[y] = dp[x] + 1;
          trip[y] = {j, k, k + k - j};
          dfs1(y, n);
        }
      }
    }
  }
}
void dfs(int x, int n) {
  for (int j = 0; j < n; j++) {
    for (int k = j + 1; k < n; k++) {
      for (int i = k + 1; i < n; i++) {
        if (i - k != k - j) continue;
        int y = x ^ (1 << j) ^ (1 << k) ^ (1 << i);
        if (dp[y] > dp[x] + 1) {
          dp[y] = dp[x] + 1;
          trip[y] = {j, k, i};
          dfs(y, n);
        }
      }
    }
  }
}
int n;
void pre() {
  memset(dp, 63, sizeof(dp));
  dp[0] = 0;
  dfs(0, 9);
  for (int j = 0; j < (1 << 9); j++) trip1[j] = trip[j];
  dfs1(0, 9);
}
int main() {
  scanf("%d", &n);
  for (int j = 1; j <= n; j++) scanf("%d", &A[j]);
  if (n <= 9) {
    memset(dp, 63, sizeof(dp));
    dp[0] = 0;
    dfs(0, n);
    int now = 0;
    for (int j = 0; j < n; j++) {
      now |= (A[j + 1] << j);
    }
    if (dp[now] == INF)
      printf("NO\n");
    else {
      printf("YES\n");
      printf("%d\n", dp[now]);
      while (now > 0) {
        int a = trip[now].a, b = trip[now].b, c = trip[now].c;
        printf("%d %d %d\n", trip[now].a + 1, trip[now].b + 1, trip[now].c + 1);
        now = now ^ (1 << a) ^ (1 << b) ^ (1 << c);
      }
    }
  } else {
    printf("YES\n");
    pre();
    vector<node> ans;
    for (int j = 1; j + 18 <= n; j += 9) {
      int now = 0;
      for (int k = j; k < j + 9; k++) {
        now |= (A[k] << (k - j));
      }
      while (now) {
        int a = trip[now].a, b = trip[now].b, c = trip[now].c;
        ans.push_back({j + trip[now].a, j + trip[now].b, j + trip[now].c});
        A[j + trip[now].a] ^= 1;
        A[j + trip[now].b] ^= 1;
        A[j + trip[now].c] ^= 1;
        now = now ^ (1 << a) ^ (1 << b);
        if (c < 9) now = now ^ (1 << c);
      }
    }
    for (int j = max(1, n - 17); j <= n; j += 9) {
      if (j + 8 > n) j = n - 8;
      int now = 0;
      for (int k = j; k < j + 9; k++) {
        now |= (A[k] << (k - j));
      }
      while (now) {
        ans.push_back({j + trip1[now].a, j + trip1[now].b, j + trip1[now].c});
        int a = trip1[now].a, b = trip1[now].b, c = trip1[now].c;
        A[j + trip1[now].a] ^= 1;
        A[j + trip1[now].b] ^= 1;
        A[j + trip1[now].c] ^= 1;
        now = now ^ (1 << a) ^ (1 << b) ^ (1 << c);
      }
    }
    printf("%d\n", ans.size());
    for (auto x : ans) printf("%d %d %d\n", x.a, x.b, x.c);
  }
  return 0;
}
