#include <bits/stdc++.h>
using namespace std;
struct point {
  int x, y, z;
  point(int _x, int _y, int _z) {
    x = _x;
    y = _y;
    z = _z;
  }
};
int A[8][3];
vector<vector<point> > graph(8, vector<point>());
bool ok = false;
vector<point> result;
long double dist(int i, int j) {
  long double x = (long double)result[i].x - result[j].x;
  x *= x;
  long double y = (long double)result[i].y - result[j].y;
  y *= y;
  long double z = (long double)result[i].z - result[j].z;
  z *= z;
  return (long double)sqrt(x + y + z);
}
void check() {
  map<long double, int> f;
  for (int i = 0; i < 8; i++)
    for (int j = i + 1; j < 8; j++) f[dist(i, j)]++;
  if (f.size() == 3) {
    map<long double, int>::iterator it1, it2, it3;
    it1 = f.begin();
    it2 = it1;
    ++it2;
    it3 = it2;
    ++it3;
    if ((it1->second == 12) && (it2->second == 12) && (it3->second == 4)) {
      long double n1 = it1->first * sqrt(2), n2 = it1->first * sqrt(3);
      if (((n1 - it2->first < 0.00001) || (it2->first - n1 < 0.00001)) &&
          ((n2 - it3->first < 0.00001) || (it3->first - n2 < 0.00001))) {
        ok = true;
        return;
      }
    }
  }
}
void solve(int x) {
  if (ok) return;
  if (x == 8) {
    check();
    return;
  }
  for (int i = 0; i < graph[x].size(); i++) {
    result.push_back(graph[x][i]);
    solve(x + 1);
    if (ok) return;
    result.pop_back();
  }
  return;
}
int main() {
  for (int i = 0; i < 8; i++)
    for (int j = 0; j < 3; j++) cin >> A[i][j];
  for (int i = 0; i < 8; i++) sort(A[i], A[i] + 3);
  graph[0].push_back(point(A[0][0], A[0][1], A[0][2]));
  for (int i = 1; i < 8; i++) {
    do {
      graph[i].push_back(point(A[i][0], A[i][1], A[i][2]));
    } while (next_permutation(A[i], A[i] + 3));
  }
  solve(0);
  if (!ok)
    cout << "NO\n";
  else {
    cout << "YES\n";
    for (int i = 0; i < 8; i++)
      cout << result[i].x << ' ' << result[i].y << ' ' << result[i].z << '\n';
  }
  return 0;
}
