#include <bits/stdc++.h>
using namespace std;
using longs = long long;
using uint = unsigned;
using ulongs = unsigned long long;
using longd = long double;
template <class printable>
void trace(const char *name, printable &&value) {
  cerr << name << " = " << value << endl;
}
template <class printable, class... args>
void trace(const char *names, printable &&value, args &&...list) {
  const char *separate = strchr(names + 1, ',');
  cerr.write(names, separate - names) << " = " << value << ',';
  trace(separate + 1, list...);
}
template <class T>
void print(T x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  static char str[40];
  int cnt = 0;
  while (x > 9) {
    str[cnt++] = (x % 10) + 48;
    x /= 10;
  }
  str[cnt++] = x + 48;
  while (cnt--) putchar(str[cnt]);
}
void print(char *s) { printf(s); }
void print(char ch) { putchar(ch); }
template <class T>
void println(T x) {
  print(x), putchar('\n');
}
static class Scanner {
  template <class T>
  inline T read() {
    T x = 0;
    int f = 0, ch = getchar();
    while (!isdigit(ch)) ch == '-' && (f = !f), ch = getchar();
    while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
    return f ? -x : x;
  }
  static inline bool isBlank(int x) { return x == ' ' || x == '\n'; }

 public:
  template <class T>
  void operator()(T &x) {
    x = read<T>();
  }
  template <class T, class... Ts>
  void operator()(T &x, Ts &...y) {
    (*this)(x), (*this)(y...);
  }
  void operator()(char *x) { scanf("%s", x); }
  void operator()(char &x) {
    do x = (char)getchar();
    while (isBlank(x));
  }
  int nextInt() { return read<int>(); }
  longs nextLongs() { return read<longs>(); }
  __int128 nextInt128() { return read<__int128>(); }
  char nextChar() {
    char x;
    (*this)(x);
    return x;
  }
} scanner;
const int N = 1e5 + 5;
int a[N];
int main() {
  ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);
  int n = scanner.nextInt(), x;
  for (int i = 1; i <= n; ++i) a[i] = scanner.nextInt();
  if (n % 2) {
    puts("YES");
    println(n - 1);
    for (int i = 1; i < n; i += 2) printf("%d %d %d\n", i, i + 1, i + 2);
    for (int i = 1; i < n; i += 2) printf("%d %d %d\n", i, i + 1, n);
  } else {
    unordered_map<int, stack<int>> cnt;
    for (int i = 1; i <= n; ++i) cnt[a[i]].push(i);
    uint tmp = 0;
    for (int i = 1; i <= n; ++i) tmp ^= (uint)a[i];
    bool ok = !tmp;
    if (!ok)
      puts("NO");
    else {
      puts("YES");
      println(n - 2);
      const auto nn = n - 1;
      for (int i = 1; i < nn; i += 2) printf("%d %d %d\n", i, i + 1, i + 2);
      for (int i = 1; i < nn; i += 2) printf("%d %d %d\n", i, i + 1, nn);
    }
  }
  return 0;
}
