#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse4")
using namespace std;
template <class T>
T gcd(T a, T b) {
  return ((b == 0) ? a : gcd(b, a % b));
}
int m[1005];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  vector<int> a(((n) * (n)));
  memset(m, 0, sizeof(m));
  for (int i = 0; i < (int)(((n) * (n))); i++) cin >> a[i], m[a[i]]++;
  if (n & 1) {
    vector<int> pos, pos1;
    for (int i = 0; i < (int)(1005); i++) {
      if (m[i])
        for (int j = 0; j < (int)((m[i] / 4)); j++) pos.push_back(i);
      m[i] %= 4;
      while (m[i]--) pos1.push_back(i);
    }
    int ans[n][n];
    for (int i = 0; i < (int)(n); i++)
      for (int j = 0; j < (int)(n); j++) ans[i][j] = -1;
    for (int i = 0; i < (int)(n / 2); i++)
      for (int j = 0; j < (int)(n / 2); j++) {
        if (!pos.size()) {
          cout << "NO" << endl;
          return 0;
        }
        int now = pos[(int)pos.size() - 1];
        pos.pop_back();
        ans[i][j] = now;
        ans[i][n - j - 1] = now;
        ans[n - i - 1][j] = now;
        ans[n - i - 1][n - j - 1] = now;
      }
    int m1[1005];
    memset(m1, 0, sizeof(m1));
    for (int i = 0; i < (int)(pos.size()); i++) {
      for (int j = 0; j < (int)(4); j++) pos1.push_back(pos[i]);
    }
    for (int i = 0; i < (int)(pos1.size()); i++) m1[pos1[i]]++;
    vector<int> pos2;
    int sp = 0;
    for (int i = 0; i < (int)(1005); i++) {
      if (m1[i]) {
        for (int j = 0; j < (int)((m1[i] / 2)); j++) pos2.push_back(i);
        if (m1[i] & 1) sp = i;
      }
    }
    ans[n / 2][n / 2] = sp;
    for (int i = 0; i < (int)(n / 2); i++) {
      if (!pos2.size()) {
        cout << "NO" << endl;
        return 0;
      }
      int num = pos2[pos2.size() - 1];
      pos2.pop_back();
      ans[n / 2][i] = num;
      ans[n / 2][n - i - 1] = num;
    }
    for (int i = 0; i < (int)(n / 2); i++) {
      if (!pos2.size()) {
        cout << "NO" << endl;
        return 0;
      }
      int num = pos2[pos2.size() - 1];
      pos2.pop_back();
      ans[i][n / 2] = num;
      ans[n - i - 1][n / 2] = num;
    }
    cout << "YES" << endl;
    for (int i = 0; i < (int)(n); i++) {
      for (int j = 0; j < (int)(n); j++) {
        if (ans[i][j] == -1) {
          cout << "NO" << endl;
          return 0;
        }
        cout << ans[i][j] << " ";
      }
      cout << endl;
    }
  } else {
    vector<int> pos;
    for (int i = 0; i < (int)(1005); i++) {
      if (m[i] % 4 != 0) {
        cout << "NO" << endl;
        return 0;
      } else if (m[i])
        for (int j = 0; j < (int)((m[i] / 4)); j++) pos.push_back(i);
    }
    int ans[n][n];
    for (int i = 0; i < (int)(n); i++)
      for (int j = 0; j < (int)(n); j++) ans[i][j] = -1;
    for (int i = 0; i < (int)(n / 2); i++)
      for (int j = 0; j < (int)(n / 2); j++) {
        if (!pos.size()) {
          cout << "NO" << endl;
          return 0;
        }
        int now = pos[(int)pos.size() - 1];
        pos.pop_back();
        ans[i][j] = now;
        ans[i][n - j - 1] = now;
        ans[n - i - 1][j] = now;
        ans[n - i - 1][n - j - 1] = now;
      }
    cout << "YES" << endl;
    for (int i = 0; i < (int)(n); i++) {
      for (int j = 0; j < (int)(n); j++) {
        if (ans[i][j] == -1) {
          cout << "NO" << endl;
          return 0;
        }
        cout << ans[i][j] << " ";
      }
      cout << endl;
    }
  }
  return 0;
}
