#include <bits/stdc++.h>
using namespace std;
template <class T>
T sqr(T x) {
  return x * x;
}
inline int getBit(long long x, int pos) { return ((x >> pos) & 1); }
const double eps = 1e-9;
const double pi = acos(-1.0);
const int m = 3;
const int n = 8;
long long tmp[m];
int v[n][m];
int vv[3][m];
void cross(int i, int j) {
  tmp[0] = (vv[i][1] * 1LL * vv[j][2] - vv[i][2] * 1LL * vv[j][1]);
  tmp[1] = (-(vv[i][0] * 1LL * vv[j][2] - vv[i][2] * 1LL * vv[j][0]));
  tmp[2] = (vv[i][0] * 1LL * vv[j][1] - vv[i][1] * 1LL * vv[j][0]);
}
long long sDist(int i, int j) {
  long long ans = 0;
  for (int k = 0; k < m; k++) {
    ans += (v[i][k] - v[j][k]) * 1LL * (v[i][k] - v[j][k]);
  }
  return ans;
}
long long a[n][n];
bool go(int pos) {
  if (pos == n) {
    long long mn = (long long)(1e18);
    int cnt = 0;
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        a[i][j] = sDist(i, j);
        a[j][i] = a[i][j];
        if (a[i][j] < mn) {
          mn = a[i][j];
          cnt = 1;
        } else if (a[i][j] == mn) {
          cnt++;
        }
      }
    }
    if (cnt == 12 && mn > 0) {
      bool good = true;
      int ver1 = 0;
      int ver2 = 1;
      while (ver2 < n && a[ver1][ver2] != mn * 3) ver2++;
      int u1 = -1, u2 = -1, u3 = -1;
      for (int u = 0; u < n; u++) {
        if (a[ver1][u] == mn) {
          if (u1 == -1) {
            u1 = u;
          } else if (u2 == -1) {
            u2 = u;
          } else if (u3 == -1) {
            u3 = u;
          } else {
            good = false;
            break;
          }
        }
      }
      if (u1 == -1 || u2 == -1 || u3 == -1) {
        good = false;
      }
      if (!good) return false;
      for (int u = 0; u < 3; u++) {
        vv[0][u] = v[u1][u] - v[ver1][u];
        vv[1][u] = v[u2][u] - v[ver1][u];
        vv[2][u] = v[u3][u] - v[ver1][u];
      }
      cross(0, 1);
      if (tmp[0] == 0 && tmp[1] == 0 && tmp[2] == 0) good = false;
      if (tmp[0] * vv[2][1] != tmp[1] * vv[2][0] ||
          tmp[0] * vv[2][2] != tmp[2] * vv[2][0]) {
        good = false;
      }
      cross(0, 2);
      if (tmp[0] == 0 && tmp[1] == 0 && tmp[2] == 0) good = false;
      if (tmp[0] * vv[1][1] != tmp[1] * vv[1][0] ||
          tmp[0] * vv[1][2] != tmp[2] * vv[1][0]) {
        good = false;
      }
      cross(1, 2);
      if (tmp[0] == 0 && tmp[1] == 0 && tmp[2] == 0) good = false;
      if (tmp[0] * vv[0][1] != tmp[1] * vv[0][0] ||
          tmp[0] * vv[0][2] != tmp[2] * vv[0][0]) {
        good = false;
      }
      if (!good) return false;
      swap(ver1, ver2);
      u1 = -1, u2 = -1, u3 = -1;
      for (int u = 0; u < n; u++) {
        if (a[ver1][u] == mn) {
          if (u1 == -1) {
            u1 = u;
          } else if (u2 == -1) {
            u2 = u;
          } else if (u3 == -1) {
            u3 = u;
          } else {
            good = false;
            break;
          }
        }
      }
      if (u1 == -1 || u2 == -1 || u3 == -1) {
        good = false;
      }
      if (!good) return false;
      for (int u = 0; u < 3; u++) {
        vv[0][u] = v[u1][u] - v[ver1][u];
        vv[1][u] = v[u2][u] - v[ver1][u];
        vv[2][u] = v[u3][u] - v[ver1][u];
      }
      cross(0, 1);
      if (tmp[0] == 0 && tmp[1] == 0 && tmp[2] == 0) good = false;
      if (tmp[0] * vv[2][1] != tmp[1] * vv[2][0] ||
          tmp[0] * vv[2][2] != tmp[2] * vv[2][0]) {
        good = false;
      }
      cross(0, 2);
      if (tmp[0] == 0 && tmp[1] == 0 && tmp[2] == 0) good = false;
      if (tmp[0] * vv[1][1] != tmp[1] * vv[1][0] ||
          tmp[0] * vv[1][2] != tmp[2] * vv[1][0]) {
        good = false;
      }
      cross(1, 2);
      if (tmp[0] == 0 && tmp[1] == 0 && tmp[2] == 0) good = false;
      if (tmp[0] * vv[0][1] != tmp[1] * vv[0][0] ||
          tmp[0] * vv[0][2] != tmp[2] * vv[0][0]) {
        good = false;
      }
      if (good) {
        return true;
      }
    }
    return false;
  }
  sort(v[pos], v[pos] + m);
  do {
    if (go(pos + 1)) return true;
  } while (next_permutation(v[pos], v[pos] + m));
  return false;
}
int main() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      scanf("%d", &v[i][j]);
    }
  }
  if (go(0)) {
    puts("YES");
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        printf("%d%c", v[i][j], " \n"[j == m - 1]);
      }
    }
  } else {
    puts("NO");
  }
  return 0;
}
