#include <bits/stdc++.h>   using namespace std;   template <class T, class L>   bool smax(T& x, L y) {     return x < y ? (x = y, 1) : 0;   }   template <class T, class L>   bool smin(T& x, L y) {     return x > y ? (x = y, 1) : 0;   }   const int maxn = 16;   int n, a[maxn], b[maxn][maxn], ex, x[maxn];   bool mark[maxn];   vector<vector<int> > all;   vector<int> todo;   int fond(int x) {     for (int i = 0; i < n * n; i++)       if (!mark[i] && a[i] == x) return i;     return -1;   }   void back(int s = 0) {     if (s == n) {       for (int i = 0, sum = 0; i < n; i++, sum = 0) {         for (int j = 0; j < n; j++) sum += b[j][i];         if (sum != ex) return;       }       {         int sum = 0;         for (int i = 0; i < n; i++) sum += b[i][i];         if (sum != ex) return;       }       {         int sum = 0;         for (int i = 0; i < n; i++) sum += b[i][n - i - 1];         if (sum != ex) return;       }       for (int i = 0; i < n; i++, cout <<   n )         for (int j = 0; j < n; j++) cout << b[i][j] <<    ;       exit(0);     }     if (s == n - 1) {       fill(b[n - 1], b[n - 1] + n, ex);       for (int i = 0; i < n - 1; i++)         for (int j = 0; j < n; j++) b[n - 1][j] -= b[i][j];       int i = 0;       for (int tmp; i < n; i++)         if (~(tmp = fond(b[n - 1][i])))           mark[tmp] = 1, todo.push_back(tmp);         else           break;       if (i == n) back(n);       for (auto x : todo) mark[x] = 0;       todo.clear();     }     for (auto v : all) {       bool reval = 1;       for (auto x : v)         if (mark[x]) {           reval = 0;           break;         }       if (!reval) continue;       do {         for (int i = 0; i < n; i++) b[s][i] = a[v[i]], mark[v[i]] = 1;         back(s + 1);         for (int i = 0; i < n; i++) mark[v[i]] = 0;       } while (next_permutation(v.begin(), v.end()));     }   }   void tof(int idx) {     if (idx == 4 && x[0] + x[1] + x[2] + x[3] != ex) return;     if (idx == 8 && x[4] + x[5] + x[6] + x[7] != ex) return;     if (idx == 12 && x[8] + x[9] + x[10] + x[11] != ex) return;     if (idx == 16 && x[12] + x[13] + x[14] + x[15] != ex) return;     if (idx == 13 && x[0] + x[4] + x[8] + x[12] != ex) return;     if (idx == 14 && x[1] + x[5] + x[9] + x[13] != ex) return;     if (idx == 15 && x[2] + x[6] + x[10] + x[14] != ex) return;     if (idx == 16 && x[3] + x[7] + x[11] + x[15] != ex) return;     if (idx == 13 && x[3] + x[6] + x[9] + x[12] != ex) return;     if (idx == 16 && x[0] + x[5] + x[10] + x[15] != ex) return;     if (idx == 16) {       for (int i = 0; i < n; i++, cout <<   n )         for (int j = 0; j < n; j++) cout << x[i * 4 + j] <<    ;       exit(0);     }     for (int i = 0; !(i >> 4); ++i)       if (!mark[i]) {         x[idx] = a[i], mark[i] = 1;         tof(idx + 1);         mark[i] = 0;       }   }   int main() {     srand(time(0));     ios::sync_with_stdio(0), cin.tie();     cin >> n;     for (int i = 0; i < n * n; i++) cin >> a[i], ex += a[i];     random_shuffle(a, a + n * n);     ex /= n;     cout << ex <<   n ;     if (n < 4) {       for (int i = 0; i < 1 << n * n; i++)         if (__builtin_popcount(i) == n) {           int sum = 0;           for (int j = 0; j < n * n; j++) sum += (i >> j & 1) * a[j];           if (sum == ex) {             all.push_back({});             for (int j = 0; j < n * n; j++)               if (i >> j & 1) all.back().push_back(j);             sort(all.back().begin(), all.back().end());           }         }       return back(), 0;     }     tof(0);     return 0;   }