#include <bits/stdc++.h>
using namespace std;
istream& inp = cin;
template <typename T>
vector<T> readV(int size) {
  vector<T> result;
  for (int i = 0; i < size; ++i) {
    T x;
    inp >> x;
    result.push_back(x);
  }
  return result;
}
template <typename T>
T divup(T a, T b) {
  if ((a % b) == 0) return a / b;
  return 1 + a / b;
}
int64_t constexpr M = 1000000007;
static_assert(M <= (1 << 30));
class modint {
  int64_t v;

 public:
  modint(int64_t x) : v(x % M) {}
  int64_t get() const { return v; }
  modint operator+(modint b) { return modint(v + b.v); }
  modint operator*(modint b) { return modint(v * b.v); }
  modint operator-(modint b) { return modint(v + M - b.v); }
};
int main() {
  assert(inp);
  int n;
  inp >> n;
  auto a = readV<int>(n);
  if ((n % 2) == 0) {
    int z = 0;
    for (int x : a) z = z ^ x;
    if (z != 0) {
      cout << "NO" << endl;
      return 0;
    }
    --n;
  }
  vector<vector<int>> ops;
  auto op = [&a, &ops](int i, int j, int k) {
    vector<int> o{i + 1, j + 1, k + 1};
    ops.push_back(o);
    int z = a.at(i) ^ a.at(j) ^ a.at(k);
    a.at(i) = a.at(j) = a.at(k) = z;
  };
  cout << "YES\n";
  for (int s = 0; s + 2 < n; s += 2) {
    op(s, s + 1, s + 2);
  }
  for (int s = 0; s + 2 < n; s += 2) {
    op(s, s + 1, n - 1);
  }
  for (int x : a) assert(a.at(0) == x);
  cout << ops.size() << endl;
  for (auto& v : ops) {
    for (int x : v) cout << x << " ";
    cout << endl;
  }
  return 0;
}
