#include <bits/stdc++.h>
using namespace std;
struct coord {
  int x, y, z;
  coord() : x(0), y(0), z(0) {}
  coord(int x, int y, int z) : x(x), y(y), z(z) {}
};
coord getVector(coord p, coord p1) {
  return coord(p1.x - p.x, p1.y - p.y, p1.z - p.z);
}
long long sProduct(coord v1, coord v2) {
  return (v1.x * (long long)v2.x) + (v1.y * (long long)v2.y) +
         (v1.z * (long long)v2.z);
}
long long squareLength(coord v1) { return sProduct(v1, v1); }
bool sameLength(coord v1, coord v2) {
  return (squareLength(v1) - squareLength(v2)) == 0;
}
bool ortho(coord v1, coord v2) { return sProduct(v1, v2) == 0; }
bool isCorner(coord p, coord p1, coord p2, coord p3) {
  coord e1 = getVector(p, p1);
  coord e2 = getVector(p, p2);
  coord e3 = getVector(p, p3);
  return ortho(e1, e2) && ortho(e1, e3) && ortho(e2, e3);
}
const int cLines = 8;
const int cDimension = 3;
coord* isCube(int** input, coord* coords, int line) {
  coord* output;
  if (line < cLines) {
    coords[line] = coord(input[line][0], input[line][1], input[line][2]);
    if ((output = isCube(input, coords, line + 1)) != NULL) return output;
    coords[line] = coord(input[line][0], input[line][2], input[line][1]);
    if ((output = isCube(input, coords, line + 1)) != NULL) return output;
    coords[line] = coord(input[line][1], input[line][0], input[line][2]);
    if ((output = isCube(input, coords, line + 1)) != NULL) return output;
    coords[line] = coord(input[line][1], input[line][2], input[line][0]);
    if ((output = isCube(input, coords, line + 1)) != NULL) return output;
    coords[line] = coord(input[line][2], input[line][1], input[line][0]);
    if ((output = isCube(input, coords, line + 1)) != NULL) return output;
    coords[line] = coord(input[line][2], input[line][0], input[line][1]);
    if ((output = isCube(input, coords, line + 1)) != NULL) return output;
    return NULL;
  } else {
    long long tSize = 0;
    long long sqrLen;
    for (int i = 1; i < cLines; i++) {
      sqrLen = squareLength(getVector(coords[0], coords[i]));
      if (sqrLen > tSize) tSize = sqrLen;
    }
    if (tSize % cDimension != 0) {
      return NULL;
    }
    tSize /= cDimension;
    int counts[cDimension + 1];
    int goals[cDimension + 1] = {1, 3, 3, 1};
    int r;
    for (int i = 0; i < cLines; i++) {
      for (int d = 0; d <= cDimension; d++) counts[d] = 0;
      for (int j = 0; j < cLines; j++) {
        sqrLen = squareLength(getVector(coords[i], coords[j]));
        if (tSize != 0 && sqrLen % tSize != 0) {
          return NULL;
        }
        if (tSize == 0 && sqrLen != 0) {
          return NULL;
        }
        r = (tSize == 0 ? 0 : sqrLen / tSize);
        if (r <= cDimension) {
          counts[r]++;
          if (counts[r] > goals[r]) return NULL;
        } else {
          return NULL;
        }
      }
    }
    return coords;
  }
}
coord* isCube(int** input) {
  coord* coords = new coord[cLines];
  coords[0] = coord(input[0][0], input[0][1], input[0][2]);
  return isCube(input, coords, 1);
}
int main() {
  int** input = new int*[cLines];
  for (int l = 0; l < cLines; l++) {
    input[l] = new int[cDimension];
    for (int d = 0; d < cDimension; d++) cin >> input[l][d];
  }
  coord* output = isCube(input);
  if (output) {
    cout << "YES" << endl;
    for (int l = 0; l < cLines; l++) {
      cout << output[l].x << " " << output[l].y << " " << output[l].z << endl;
    }
  } else {
    cout << "NO" << endl;
  }
  return 0;
}
