#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;   }