#include <bits/stdc++.h>
using namespace std;
long long p[8][3];
long long Dist(int x, int y) {
  return (p[x][0] - p[y][0]) * (p[x][0] - p[y][0]) +
         (p[x][1] - p[y][1]) * (p[x][1] - p[y][1]) +
         (p[x][2] - p[y][2]) * (p[x][2] - p[y][2]);
}
bool is_ok() {
  int i, j, k = 0;
  long long D[8];
  for (int i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) D[j] = Dist(i, j);
    sort(D, D + 8);
    if (D[1] == 0) return 0;
    if (D[1] == D[2] && D[2] == D[3] && D[4] == D[5] && D[5] == D[6]) continue;
    return 0;
  }
  return 1;
}
bool scan() {
  int i, j, k = 0;
  while (scanf("%I64d%I64d%I64d", &p[k][0], &p[k][1], &p[k][2]) == 3) {
    k++;
    if (k == 8) break;
  }
  return k > 0;
}
bool flag = 0;
long long count1;
void recur(int n) {
  if (n == 8) {
    flag = is_ok();
    return;
  }
  if (flag == 1) return;
  recur(n + 1);
  if (flag == 1) return;
  swap(p[n][1], p[n][2]);
  recur(n + 1);
  if (flag == 1) return;
  swap(p[n][0], p[n][1]);
  recur(n + 1);
  if (flag == 1) return;
  swap(p[n][1], p[n][2]);
  recur(n + 1);
  if (flag == 1) return;
  swap(p[n][0], p[n][1]);
  recur(n + 1);
  if (flag == 1) return;
  swap(p[n][1], p[n][2]);
  recur(n + 1);
  if (flag == 1) return;
  swap(p[n][0], p[n][1]);
  swap(p[n][0], p[n][2]);
}
int main() {
  int n, a, b, m;
  int i, j, k;
  while (scan()) {
    flag = 0;
    recur(0);
    if (flag)
      printf("YES\n");
    else
      printf("NO\n");
    if (flag)
      for (i = 0; i < 8; i++)
        printf("%I64d %I64d %I64d\n", p[i][0], p[i][1], p[i][2]);
  }
}
