#include <bits/stdc++.h>
using namespace std;
#pragma warning(disable : 4351)
long long cube[8][3];
struct Dist {
  Dist() : dists{}, count{} {}
  bool add(long long d) {
    if (!count[0] && !count[1] && !count[2]) {
      dists[0] = d;
      count[0] = 1;
      return true;
    }
    if (count[0] && d == dists[0]) {
      ++count[0];
      return count[0] <= 12;
    }
    if (count[1] && d == dists[1]) {
      ++count[1];
      return count[1] <= 12;
    }
    if (count[2] && d == dists[2]) {
      ++count[2];
      return count[2] <= 4;
    }
    if (count[0] && !count[1] && !count[2]) {
      if (dists[0] < d) {
        if (d == 2 * dists[0]) {
          dists[1] = d;
          count[1] = 1;
          return true;
        }
        if (d == 3 * dists[0]) {
          dists[2] = d;
          count[2] = 1;
          return true;
        }
        if (2 * d == 3 * dists[0]) {
          dists[1] = dists[0];
          count[1] = count[0];
          dists[0] = 0;
          count[0] = 0;
          dists[2] = d;
          count[2] = 1;
          return true;
        }
      } else {
        if (2 * d == dists[0]) {
          dists[1] = dists[0];
          count[1] = count[0];
          dists[0] = 0;
          count[0] = 0;
          dists[0] = d;
          count[0] = 1;
          return true;
        }
        if (3 * d == dists[0]) {
          dists[2] = dists[0];
          count[2] = count[0];
          dists[0] = 0;
          count[0] = 0;
          dists[0] = d;
          count[0] = 1;
          return true;
        }
        if (3 * d == 2 * dists[0]) {
          dists[2] = dists[0];
          count[2] = count[0];
          dists[0] = 0;
          count[0] = 0;
          dists[1] = d;
          count[1] = 1;
          return true;
        }
      }
    }
    if (!count[0] && count[1] && count[2]) {
      if (2 * d == dists[1]) {
        dists[0] = d;
        count[0] = 1;
        return true;
      }
    }
    if (count[0] && count[1] && !count[2]) {
      if (d = 3 * dists[0]) {
        dists[2] = d;
        count[2] = 1;
        return true;
      }
    }
    if (count[0] && !count[1] && count[2]) {
      if (d = 2 * dists[0]) {
        dists[1] = d;
        count[1] = 1;
        return true;
      }
    }
    return false;
  }
  long long dists[3];
  int count[3];
};
long long distSq(int v, int w) {
  return (cube[v][0] - cube[w][0]) * (cube[v][0] - cube[w][0]) +
         (cube[v][1] - cube[w][1]) * (cube[v][1] - cube[w][1]) +
         (cube[v][2] - cube[w][2]) * (cube[v][2] - cube[w][2]);
}
bool updateVertex(int v, Dist& edges) {
  for (int i = 0; i < v; ++i) {
    long long d = distSq(i, v);
    if (!d || !edges.add(d)) {
      return false;
    }
  }
  return true;
}
bool solve(int v, Dist& edges) {
  if (v == 8) {
    return true;
  }
  long long x = cube[v][0];
  long long y = cube[v][1];
  long long z = cube[v][2];
  long long xyz[][3] = {
      {x, y, z}, {x, z, y}, {y, x, z}, {y, z, x}, {z, x, y}, {z, y, x},
  };
  for (int i = 0; i < 6; ++i) {
    cube[v][0] = xyz[i][0];
    cube[v][1] = xyz[i][1];
    cube[v][2] = xyz[i][2];
    Dist e = edges;
    if (updateVertex(v, e) && solve(v + 1, e)) {
      return true;
    }
  }
  return false;
}
int main() {
  for (int i = 0; i < 8; ++i) {
    for (int j = 0; j < 3; ++j) {
      cin >> cube[i][j];
    }
  }
  Dist edges;
  bool b = solve(0, edges);
  if (b) {
    cout << "YES" << endl;
    for (int i = 0; i < 8; ++i) {
      cout << cube[i][0] << ' ' << cube[i][1] << ' ' << cube[i][2] << endl;
    }
  } else {
    cout << "NO" << endl;
  }
}
