#include <bits/stdc++.h>
const long long INF = 0x7fffffffffffffff;
struct vector {
  long long r[3];
  vector() {}
  vector(long long x_, long long y_, long long z_) {
    r[0] = x_;
    r[1] = y_;
    r[2] = z_;
  }
};
long long distance(vector a, vector b) {
  long long sum = 0;
  for (int i = 0; i < 3; i++) sum += (a.r[i] - b.r[i]) * (a.r[i] - b.r[i]);
  return sum;
}
long long max(long long a, long long b) { return a > b ? a : b; }
long long min(long long a, long long b) { return a > b ? b : a; }
vector pt[9];
vector md[9];
bool cubeTest() {
  long long shortest = INF;
  long long longest = -1;
  for (int i = 2; i <= 8; i++) {
    shortest = min(shortest, distance(md[1], md[i]));
    longest = max(longest, distance(md[1], md[i]));
  }
  if (shortest != longest / 3) return false;
  long long mid = shortest * 2;
  if (shortest == 0) return false;
  if (shortest == longest) return false;
  long long cnt[3] = {0, 0, 0};
  for (int i = 1; i <= 8; i++) {
    for (int j = i + 1; j <= 8; j++) {
      long long k = distance(md[i], md[j]);
      if (k == shortest)
        cnt[0]++;
      else if (k == mid)
        cnt[1]++;
      else if (k == longest)
        cnt[2]++;
      else
        return false;
    }
  }
  if (cnt[0] != 12 || cnt[1] != 12 || cnt[2] != 4)
    return false;
  else
    return true;
}
void solve(long long D) {
  if (D == 0) {
    if (cubeTest()) {
      printf("YES\n");
      for (int i = 1; i <= 8; i++) {
        printf("%lld %lld %lld\n", md[i].r[0], md[i].r[1], md[i].r[2]);
      }
      exit(0);
    }
    return;
  }
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (j == i) continue;
      for (int k = 0; k < 3; k++) {
        if (k == i || k == j) continue;
        md[D].r[0] = pt[D].r[i];
        md[D].r[1] = pt[D].r[j];
        md[D].r[2] = pt[D].r[k];
        solve(D - 1);
      }
    }
  }
}
int main() {
  for (int i = 1; i <= 8; i++)
    scanf("%lld %lld %lld", &pt[i].r[0], &pt[i].r[1], &pt[i].r[2]);
  solve(8);
  printf("NO\n");
  return 0;
}
