#include <bits/stdc++.h>
using namespace std;
const int N = 100050;
bool found = false;
struct point {
  int x, y, z;
  point() {}
  point(int _x, int _y, int _z) : x(_x), y(_y), z(_z) {}
  void print() { printf("%d %d %d\n", x, y, z); }
  bool operator==(const point& s1) {
    return x == s1.x && y == s1.y && z == s1.z;
  }
} myvector[N];
vector<point> rec[N];
vector<point> shuffle(int x, int y, int z) {
  vector<point> ret;
  ret.push_back(point(x, y, z));
  ret.push_back(point(x, z, y));
  ret.push_back(point(y, x, z));
  ret.push_back(point(y, z, x));
  ret.push_back(point(z, x, y));
  ret.push_back(point(z, y, x));
  return ret;
}
inline long long Pow(long long x) { return x * x; }
long long cal(point x1, point x2) {
  long long sum = Pow(x1.x - x2.x) + Pow(x1.y - x2.y) + Pow(x1.z - x2.z);
  return sum;
}
map<long long, int> times;
bool check() {
  map<long long, int>::iterator it;
  for (it = times.begin(); it != times.end(); it++)
    if (it->second == 12) {
      long long len = it->first;
      vector<point> same;
      for (int i = 1; i < 8; i++)
        if (cal(myvector[0], myvector[i]) == len) same.push_back(myvector[i]);
      int size = (int)same.size();
      if (size < 3) return false;
      if (cal(same[0], same[1]) != 2 * len) return false;
      return true;
    }
  return false;
}
int counts = 0;
bool cut(int round) {
  int mx = 0;
  map<long long, int>::iterator it;
  for (it = times.begin(); it != times.end(); it++) mx = max(mx, it->second);
  if (mx + (8 - round) * 3 < 12) return false;
  return true;
}
void dfs(int id) {
  if (found) return;
  if (!cut(id)) return;
  if (id == 8) {
    counts += 1;
    if (check()) {
      puts("YES");
      for (int i = 0; i < 8; i++) myvector[i].print();
      found = true;
    }
    return;
  }
  for (int i = 0; i < 6; i++) {
    bool spe = false;
    myvector[id] = rec[id][i];
    for (int j = 0; j < id; j++) {
      if (myvector[j] == myvector[id]) spe = true;
    }
    if (spe) continue;
    vector<long long> dist;
    for (int j = 0; j < id; j++) {
      dist.push_back(cal(myvector[id], myvector[j]));
      times[dist[j]]++;
    }
    dfs(id + 1);
    for (int j = 0; j < id; j++) {
      times[dist[j]]--;
    }
  }
}
inline void stop() {
  while (1) {
  }
}
int n = 8;
int main() {
  for (int i = 0; i < n; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    rec[i] = shuffle(x, y, z);
  }
  dfs(0);
  if (!found) puts("NO");
  return 0;
}
