#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y, z;
} a[10];
int flag;
long long v[5];
long long dist(int i, int j) {
  long long x = a[i].x - a[j].x;
  long long y = a[i].y - a[j].y;
  long long z = a[i].z - a[j].z;
  return x * x + y * y + z * z;
}
int ok() {
  int cnt = 0;
  for (int i = 1; i < 8; i++)
    for (int j = 0; j < i; j++) {
      long long w = dist(i, j);
      if (!cnt)
        v[++cnt] = w;
      else {
        int k = 1;
        while (k <= cnt && v[k] != w) k++;
        if (k > cnt && cnt == 3) return 0;
        if (k > cnt) v[++cnt] = w;
      }
    }
  if (cnt == 3) return 1;
  return 0;
}
void dfs(int p) {
  if (flag) return;
  if (p == 8) {
    if (ok()) flag = 1;
    return;
  }
  node tmp = a[p];
  dfs(p + 1);
  if (!flag) {
    a[p].y = tmp.z;
    a[p].z = tmp.y;
    dfs(p + 1);
  }
  if (!flag) {
    a[p].x = tmp.y;
    a[p].y = tmp.x;
    a[p].z = tmp.z;
    dfs(p + 1);
  }
  if (!flag) {
    a[p].x = tmp.y;
    a[p].y = tmp.z;
    a[p].z = tmp.x;
    dfs(p + 1);
  }
  if (!flag) {
    a[p].x = tmp.z;
    a[p].y = tmp.x;
    a[p].z = tmp.y;
    dfs(p + 1);
  }
  if (!flag) {
    a[p].x = tmp.z;
    a[p].y = tmp.y;
    a[p].z = tmp.x;
    dfs(p + 1);
  }
}
int main() {
  for (int i = 0; i < 8; i++) cin >> a[i].x >> a[i].y >> a[i].z;
  dfs(0);
  if (!flag)
    puts("NO");
  else {
    puts("YES");
    for (int i = 0; i < 8; i++) printf("%d %d %d\n", a[i].x, a[i].y, a[i].z);
  }
}
