#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000")
using namespace std;
struct point {
  int x, y, z;
};
point a[8], tmp[8];
int used[8];
long long int d[8];
inline long long int dist(int i, int j) {
  return 1ll * (tmp[i].x - tmp[j].x) * (tmp[i].x - tmp[j].x) +
         1ll * (tmp[i].y - tmp[j].y) * (tmp[i].y - tmp[j].y) +
         1ll * (tmp[i].z - tmp[j].z) * (tmp[i].z - tmp[j].z);
}
bool check_cube() {
  for (int i = 0; i < 8; ++i) {
    for (int j = 0; j < 8; ++j) d[j] = dist(i, j);
    for (int j = 0; j < 8; ++j)
      for (int k = 0; k < 8; ++k)
        if (d[j] < d[k]) swap(d[j], d[k]);
    long long int md = d[0], sd = d[1], a = d[4];
    bool ans = (md != sd && sd != a && a != 0 && (d[1] == d[2]) &&
                (d[2] == d[3]) && (d[4] == d[5]) && (d[5] == d[6]));
    if (!ans) return false;
  }
  return true;
}
bool rec(int l) {
  if (l == 8) return check_cube();
  tmp[l] = {a[l].x, a[l].y, a[l].z};
  if (rec(l + 1)) return true;
  tmp[l] = {a[l].x, a[l].z, a[l].y};
  if (rec(l + 1)) return true;
  tmp[l] = {a[l].y, a[l].x, a[l].z};
  if (rec(l + 1)) return true;
  tmp[l] = {a[l].z, a[l].x, a[l].y};
  if (rec(l + 1)) return true;
  tmp[l] = {a[l].z, a[l].y, a[l].x};
  if (rec(l + 1)) return true;
  tmp[l] = {a[l].y, a[l].z, a[l].x};
  if (rec(l + 1)) return true;
  return false;
}
int main() {
  for (int i = 0; i < 8; ++i) scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
  bool ans = rec(0);
  if (ans) {
    printf("YES\n");
    for (int i = 0; i < 8; ++i)
      printf("%d %d %d\n", tmp[i].x, tmp[i].y, tmp[i].z);
  } else
    printf("NO\n");
}
