#include <bits/stdc++.h>
using namespace std;
int cnt[1100], visited[1100];
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  int a[n * n];
  deque<int> dis;
  for (int i = 0; i < n * n; i++) {
    cin >> a[i];
    if (!cnt[a[i]]) dis.push_back(a[i]);
    cnt[a[i]]++;
  }
  priority_queue<pair<int, int> > qq;
  int res[n][n];
  memset(res, 0, sizeof res);
  if (n & 1) {
    for (int i = 0; i < dis.size(); i++) {
      if (cnt[dis[i]] & 1) {
        res[n / 2][n / 2] = dis[i];
        cnt[dis[i]]--;
        break;
      }
    }
  }
  for (int i = 0; i < dis.size(); i++) {
    if (cnt[dis[i]] % 4 == 0)
      qq.push({cnt[dis[i]], dis[i]});
    else
      qq.push({cnt[dis[i]], dis[i]});
  }
  for (int i = 0; i < n / 2; i++) {
    for (int j = 0; j < n / 2; j++) {
      pair<int, int> temp = {0, 0};
      if (!qq.empty()) {
        temp = qq.top();
        qq.pop();
      }
      if (cnt[temp.second] > 0 && temp.second != 0) {
        res[i][j] = temp.second;
        cnt[temp.second] -= 4;
        if (cnt[temp.second]) qq.push({cnt[temp.second], temp.second});
      }
    }
  }
  pair<int, int> temp = {0, 0};
  if (n & 1) {
    for (int i = 0; i < n / 2; i++) {
      if (!qq.empty()) {
        temp = qq.top();
        qq.pop();
      }
      if (cnt[temp.second] > 0) {
        res[i][n / 2] = temp.second;
        res[n - i - 1][n / 2] = temp.second;
        cnt[temp.second] -= 2;
        if (cnt[temp.second]) qq.push(temp);
      }
    }
    temp = {0, 0};
    for (int i = 0; i < n / 2; i++) {
      if (!qq.empty()) {
        temp = qq.top();
        qq.pop();
      }
      if (cnt[temp.second] > 0) {
        res[n / 2][i] = temp.second;
        res[n / 2][n - i - 1] = temp.second;
        cnt[temp.second] -= 2;
        if (cnt[temp.second]) qq.push(temp);
      }
    }
  }
  for (int i = 0; i < n / 2; i++) {
    for (int j = 0; j < n / 2; j++) {
      res[n - i - 1][j] = res[i][j];
      res[i][n - 1 - j] = res[i][j];
      res[n - i - 1][n - 1 - j] = res[i][j];
    }
  }
  int flag = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (res[n - i - 1][j] != res[i][j] || res[i][n - 1 - j] != res[i][j] ||
          res[n - i - 1][n - 1 - j] != res[i][j] || !res[i][j])
        flag = 1;
    }
  }
  for (int i = 0; i < dis.size(); i++) {
    if (cnt[dis[i]] < 0) {
      flag = 1;
      break;
    }
  }
  if (!flag) {
    cout << "YES\n";
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) cout << res[i][j] << " ";
      cout << "\n";
    }
  } else
    cout << "NO\n";
  return 0;
}
