#include <bits/stdc++.h>
using namespace std;
typedef struct {
  long long x, y, z;
} node;
node cube[10], test[9];
int times[10];
int flag = 0;
long long d[10];
long long Dis(node a, node b) {
  return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) +
         (a.z - b.z) * (a.z - b.z);
}
bool cmp(node a, node b) { return Dis(a, test[0]) < Dis(b, test[0]); }
bool isV(node a, node b) {
  node k1, k2;
  k1.x = a.x - test[0].x;
  k1.y = a.y - test[0].y;
  k1.z = a.z - test[0].z;
  k2.x = b.x - test[0].x;
  k2.y = b.y - test[0].y;
  k2.z = b.z - test[0].z;
  if (k1.x * k2.x + k1.y * k2.y + k1.z * k2.z) return false;
  return true;
}
bool isnotcube() {
  for (int i = 2; i <= 8; i++) d[i] = Dis(test[0], test[i]);
  if (d[2] != d[3] || d[2] != d[4] || d[4] != d[3]) return true;
  if (d[2] == 0) {
    flag = 1;
    return true;
  }
  if (!isV(test[2], test[3]) || !isV(test[3], test[4]) ||
      !isV(test[4], test[2]))
    return true;
  if (d[5] != d[6] || d[5] != d[7] || d[6] != d[7]) return true;
  if (d[5] != 2 * d[2] || d[8] != 3 * d[2]) return true;
  test[0] = test[8];
  if (!isV(test[5], test[6]) || !isV(test[5], test[7]) ||
      !isV(test[6], test[7]))
    return true;
  return false;
}
bool isSuit() {
  for (int i = 1; i <= 8; i++) test[i] = cube[i];
  test[0] = cube[1];
  sort(test + 1, test + 9, cmp);
  if (isnotcube()) return false;
  return true;
}
bool isfound(int ind) {
  if (flag == 1) return false;
  if (ind == 1) {
    if (isSuit()) return true;
  }
  if (ind > 7) return false;
  long long temp;
  while (times[ind] <= 5) {
    if (times[ind] % 2 && times[ind]) {
      temp = cube[ind].y;
      cube[ind].y = cube[ind].z;
      cube[ind].z = temp;
      if (isSuit()) return true;
    } else if (times[ind]) {
      temp = cube[ind].x;
      cube[ind].x = cube[ind].y;
      cube[ind].y = temp;
      if (isSuit()) return true;
    }
    if (isfound(ind + 1)) return true;
    times[ind]++;
  }
  times[ind] = 0;
  return false;
}
int main() {
  for (int i = 1; i <= 8; i++)
    scanf("%I64d%I64d%I64d", &cube[i].x, &cube[i].y, &cube[i].z);
  if (isfound(1) == false) {
    printf("NO\n");
    return 0;
  }
  printf("YES\n");
  for (int i = 1; i <= 8; i++)
    printf("%I64d %I64d %I64d\n", cube[i].x, cube[i].y, cube[i].z);
  return 0;
}
