#include <bits/stdc++.h>
using namespace std;
map<int, int> mp;
set<int> s;
struct S {
  int x, y;
} a[500];
bool cmp(S a, S b) { return a.y > b.y; }
int b[30][30];
int main() {
  int n, i, x, num = 0, j;
  cin >> n;
  for (i = 0; i < n * n; i++) {
    cin >> x;
    mp[x]++;
  }
  for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {
    a[num].x = it->first;
    a[num].y = it->second;
    num++;
  }
  if (n % 2 == 0) {
    int sum = n * n / 4;
    for (i = 0; i < num; i++) {
      sum -= a[i].y / 4;
    }
    if (sum != 0) {
      cout << "NO" << endl;
      return 0;
    }
  } else {
    int sum = (n * n - n - n + 1) / 4;
    int cc = 0;
    for (i = 0; i < num; i++) {
      sum -= a[i].y / 4;
      if (a[i].y % 2 == 1) cc++;
    }
    if (sum > 0 || cc > 1) {
      cout << "NO" << endl;
      return 0;
    }
  }
  int pos1 = n / 2, pos2 = n / 2;
  for (i = 0; i < num; i++) {
    while (a[i].y >= 4) {
      a[i].y -= 4;
      b[pos1][pos2] = b[pos1][n - pos2 + 1] = b[n - pos1 + 1][pos2] =
          b[n - pos1 + 1][n - pos2 + 1] = a[i].x;
      pos1--;
      if (pos1 == 0 && pos2 > 0) {
        pos2--;
        pos1 = n / 2;
      }
      if (pos2 == 0) break;
    }
    if (pos2 == 0) break;
  }
  if (n % 2 == 1) {
    int pos = 1;
    sort(a, a + num, cmp);
    for (i = 0; a[i].y > 1; i++) {
      while (a[i].y >= 2) {
        a[i].y -= 2;
        b[pos][n / 2 + 1] = b[n - pos + 1][n / 2 + 1] = a[i].x;
        pos++;
        if (pos == n / 2 + 1) break;
      }
      if (pos == n / 2 + 1) break;
    }
    pos = 1;
    sort(a, a + num, cmp);
    for (i = 0; a[i].y > 1; i++) {
      while (a[i].y >= 2) {
        a[i].y -= 2;
        b[n / 2 + 1][pos] = b[n / 2 + 1][n - pos + 1] = a[i].x;
        pos++;
        if (pos == n / 2 + 1) break;
      }
      if (pos == n / 2 + 1) break;
    }
    sort(a, a + num, cmp);
    b[n / 2 + 1][n / 2 + 1] = a[0].x;
  }
  cout << "YES" << endl;
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) cout << b[i][j] << " ";
    cout << endl;
  }
}
