#include <bits/stdc++.h>
using namespace std;
struct point {
  long long p[3];
  point() {}
  point(long long x, long long y, long long z) {
    p[0] = x;
    p[1] = y;
    p[2] = z;
  }
  long long dis() { return p[0] * p[0] + p[1] * p[1] + p[2] * p[2]; }
  point operator-(const point &l) const {
    return point(p[0] - l.p[0], p[1] - l.p[1], p[2] - l.p[2]);
  }
  point operator+(const point &l) const {
    return point(p[0] + l.p[0], p[1] + l.p[1], p[2] + l.p[2]);
  }
  bool operator==(const point &l) const {
    return p[0] == l.p[0] && p[1] == l.p[1] && p[2] == l.p[2];
  }
};
point D[10];
bool chk() {
  point M[10];
  vector<point> P[5];
  long long dis[10];
  for (int i = 1; i <= 8; i++) {
    M[i] = D[i] - D[1];
    dis[i] = M[i].dis();
  }
  long long mn = 987654321987654321ll;
  for (int i = 2; i <= 8; i++) {
    mn = min(dis[i], mn);
  }
  if (mn == 0) return false;
  for (int i = 2; i <= 8; i++) {
    if (dis[i] % mn != 0 || dis[i] / mn > 3) return false;
    P[dis[i] / mn].push_back(M[i]);
  }
  if (P[1].size() != 3 || P[2].size() != 3 || P[3].size() != 1) return false;
  point tt = point(0, 0, 0);
  for (int i = 0; i < 3; i++) {
    tt = tt + P[1][i];
    for (int j = i + 1; j < 3; j++) {
      point s = P[1][i] + P[1][j];
      int k;
      for (k = 0; k < 3; k++) {
        if (P[2][k] == s) break;
      }
      if (k == 3) return false;
    }
  }
  if (tt == P[3][0]) return true;
  return false;
}
int main() {
  for (int i = 1; i <= 8; i++) {
    for (int j = 0; j < 3; j++) {
      scanf("%lld", D[i].p + j);
    }
    sort(D[i].p, D[i].p + 3);
  }
  int i;
  while (1) {
    if (chk()) {
      printf("YES\n");
      for (int i = 1; i <= 8; i++) {
        for (int j = 0; j < 3; j++) {
          printf("%lld ", D[i].p[j]);
        }
        printf("\n");
      }
      return 0;
    }
    for (i = 8; i >= 1; i--) {
      if (!next_permutation(D[i].p, D[i].p + 3)) {
        sort(D[i].p, D[i].p + 3);
      } else
        break;
    }
    if (i == 0) break;
  }
  printf("NO\n");
}
