#include <bits/stdc++.h>
#pragma gcc optimize("ofast")
using namespace std;
long long modexp(long long a, long long b, long long m) {
  long long r = 1;
  a = a % m;
  while (b > 0) {
    if (b & 1) r = (r * a) % m;
    b >> 1;
    a = (a * a) % m;
  }
  return r % m;
}
long long n;
map<long long, long long> cnt;
priority_queue<pair<long long, long long>> q;
vector<vector<long long>> grid;
int main() {
  cin >> n;
  for (int i = 0; i < n * n; i++) {
    long long x;
    cin >> x;
    cnt[x]++;
  }
  for (auto x : cnt) q.push(make_pair(x.second, x.first));
  grid = vector<vector<long long>>(n, vector<long long>(n));
  long long m = n / 2;
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < m; j++) {
      pair<long long, long long> p = q.top();
      q.pop();
      if (p.first < 4) {
        cout << "NO\n";
        return 0;
      }
      grid[i][j] = p.second;
      grid[n - 1 - i][j] = p.second;
      grid[i][n - 1 - j] = p.second;
      grid[n - 1 - i][n - 1 - j] = p.second;
      p.first -= 4;
      q.push(p);
    }
  }
  if (n % 2 != 0) {
    for (int i = 0; i < m; i++) {
      pair<long long, long long> p = q.top();
      q.pop();
      if (p.first < 2) {
        cout << "NO\n";
        return 0;
      }
      grid[i][m] = p.second;
      grid[n - 1 - i][m] = p.second;
      p.first -= 2;
      q.push(p);
    }
    for (int i = 0; i < m; i++) {
      pair<long long, long long> p = q.top();
      q.pop();
      if (p.first < 2) {
        cout << "NO\n";
        return 0;
      }
      grid[m][i] = p.second;
      grid[m][n - i - 1] = p.second;
      p.first -= 2;
      q.push(p);
    }
    pair<long long, long long> p = q.top();
    grid[m][m] = p.second;
  }
  cout << "YES\n";
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) cout << grid[i][j] << " ";
    cout << endl;
  }
  return 0;
}
