#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void get(T &n) {
  char c = getchar();
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  n = 0;
  T s = 1;
  if (c == '-') s = -1, c = getchar();
  while (c >= '0' && c <= '9') n *= 10, n += c - '0', c = getchar();
  n *= s;
}
const long long maxn = 10;
const long long p[6][3] = {{0, 1, 2}, {0, 2, 1}, {1, 0, 2},
                           {1, 2, 0}, {2, 0, 1}, {2, 1, 0}};
long long a[8][3], ds[8], flag[8];
long long ans[8][3], tmp[3], tn;
set<long long> d;
long long dis(long long i, long long j) {
  return ((a[i][0] - a[j][0]) * (a[i][0] - a[j][0])) +
         ((a[i][1] - a[j][1]) * (a[i][1] - a[j][1])) +
         ((a[i][2] - a[j][2]) * (a[i][2] - a[j][2]));
}
set<long long>::iterator nx(set<long long>::iterator x) { return ++x; }
bool dfs(long long i) {
  long long k, ta[3], j, ds[8];
  bool flag[8];
  set<long long>::iterator ti;
  if (i == 8) {
    return true;
  }
  memmove(ta, a[i], sizeof(ta));
  memset(flag, 0, sizeof(flag));
  for (k = (0); k <= (5); ++k) {
    for (j = (0); j <= (2); ++j) a[i][j] = ta[p[k][j]];
    for (j = (0); j <= (i - 1); ++j) {
      ds[j] = dis(i, j);
      if (!ds[j]) break;
      flag[j] = d.insert(ds[j]).second;
      if (int((d).size()) > 3)
        break;
      else if (int((d).size()) == 3) {
        ti = d.begin();
        if (*nx(ti) != *ti * 2 || *nx(nx(ti)) != *ti * 3) break;
      }
    }
    if (j > i - 1 && dfs(i + 1)) return true;
    for (j = (i - 1); j >= (0); --j)
      if (flag[j]) d.erase(ds[j]);
  }
  memmove(a[i], ta, sizeof(ta));
  return false;
}
int main() {
  long long i, j, k, t, tt;
  for (i = (0); i <= (7); ++i) get(a[i][0]), get(a[i][1]), get(a[i][2]);
  if (dfs(0)) {
    puts("YES");
    for (i = (0); i <= (7); ++i)
      cout << a[i][0] << " " << a[i][1] << " " << a[i][2] << "\n";
  } else
    puts("NO");
  return 0;
}
