#include <bits/stdc++.h>   using namespace std;   int n, m, Magic, md, pd;   int a[99], b[99], cnt[99], row[99], col[99];   int t[99][99];   void giveans() {     printf( %d n , Magic);     for (int i = 0; i < n; i++)       for (int j = 0; j < n; j++) printf( %d%c , t[i][j],    n [j + 1 == n]);     exit(0);   }   void dfs2(int, int);   void dfs(int x, int y) {     if (x == n) {       if (row[n - 1] == Magic && md == Magic && pd == Magic) giveans();     } else if (x == 2 && y == 0)       dfs(x, y + 1);     else if (x == 2 && y == 3)       dfs(x + 1, 0);     else if (x == n - 1) {       int tmp, tmp1, tmp2;       if (y == 0)         tmp = lower_bound(b, b + m, Magic - pd) - b;       else         tmp = lower_bound(b, b + m, Magic - col[y]) - b;       if ((y == 0 && b[tmp] != Magic - pd) ||           (y != 0 && b[tmp] != Magic - col[y]))         return;       if (!cnt[tmp]) return;       cnt[tmp]--;       t[x][y] = b[tmp];       if (y == n - 1) md += b[tmp];       if (!y) pd += b[tmp];       row[x] += b[tmp];       col[y] += b[tmp];       bool ok = 1, need = 0;       if (y == 0 && ok) {         tmp1 = lower_bound(b, b + m, Magic - col[0]) - b;         if (b[tmp1] != Magic - col[0] || !cnt[tmp1])           ok = 0;         else {           cnt[tmp1]--;           col[0] += b[tmp1];           row[2] += b[tmp1];           t[2][0] = b[tmp1];           tmp2 = lower_bound(b, b + m, Magic - row[2]) - b;           if (b[tmp2] != Magic - row[2] || !cnt[tmp2]) {             ok = 0;             col[0] -= b[tmp1];             row[2] -= b[tmp1];             cnt[tmp1]++;           } else {             cnt[tmp2]--;             t[2][3] = b[tmp2];             col[3] += b[tmp2];             row[2] += b[tmp2];             need = 1;           }         }       }       if (ok) {         if (y == n - 1)           dfs(x + 1, 0);         else           dfs(x, y + 1);       }       if (need) {         cnt[tmp1]++;         col[0] -= b[tmp1];         row[2] -= b[tmp1];         cnt[tmp2]++;         col[3] -= b[tmp2];         row[2] -= b[tmp2];       }       if (!y) pd -= b[tmp];       if (y == n - 1) md -= b[tmp];       col[y] -= b[tmp];       row[x] -= b[tmp];       cnt[tmp]++;     } else if (y == n - 1) {       int tmp = lower_bound(b, b + m, Magic - row[x]) - b;       if (b[tmp] != Magic - row[x]) return;       if (!cnt[tmp]) return;       cnt[tmp]--;       t[x][y] = b[tmp];       if (!x) pd += b[tmp];       col[y] += b[tmp];       row[x] += b[tmp];       dfs(x + 1, 0);       col[y] -= b[tmp];       row[x] -= b[tmp];       if (!x) pd -= b[tmp];       cnt[tmp]++;     } else {       for (int i = 0; i < m; i++)         if (cnt[i]) {           cnt[i]--;           t[x][y] = b[i];           row[x] += b[i];           col[y] += b[i];           if (x == y) md += b[i];           if (x + y == n - 1) pd += b[i];           dfs(x, y + 1);           if (x + y == n - 1) pd -= b[i];           if (x == y) md -= b[i];           col[y] -= b[i];           row[x] -= b[i];           cnt[i]++;         }     }   }   int main() {     srand(13451);     scanf( %d , &n);     srand(rand() * 10 + rand() + n);     for (int i = 0; i < n * n; i++)       scanf( %d , a + i), Magic += a[i], b[i] = a[i];     if (n == 1) {       printf( %d n%d n , a[0], a[0]);       return 0;     }     sort(b, b + n * n);     m = unique(b, b + n * n) - b;     b[m] = 1000000000;     for (int i = 0; i < n * n; i++) cnt[lower_bound(b, b + m, a[i]) - b]++;     Magic /= n;     if (n < 4) dfs2(0, 0);     int p[200];     for (int i = 0; i < m; i++) p[i] = i;     random_shuffle(p, p + m);     for (int i = 0; i < m; i++) {       cnt[i]--;       t[0][0] = b[i];       row[0] += b[i];       col[0] += b[i];       md += b[i];       dfs(0, 1);       row[0] -= b[i];       col[0] -= b[i];       md -= b[i];       cnt[i]++;     }     return 0;   }   void dfs2(int x, int y) {     if (x == n) {       if (row[n - 1] == Magic && md == Magic && pd == Magic) giveans();     } else if (x == n - 1) {       int tmp = lower_bound(b, b + m, Magic - col[y]) - b;       if (b[tmp] != Magic - col[y]) return;       if (!cnt[tmp]) return;       cnt[tmp]--;       t[x][y] = b[tmp];       if (y == n - 1) md += b[tmp];       if (!y) pd += b[tmp];       row[x] += b[tmp];       if (pd == Magic) {         if (y == n - 1)           dfs2(x + 1, 0);         else           dfs2(x, y + 1);       }       if (!y) pd -= b[tmp];       if (y == n - 1) md -= b[tmp];       row[x] -= b[tmp];       cnt[tmp]++;     } else if (y == n - 1) {       int tmp = lower_bound(b, b + m, Magic - row[x]) - b;       if (b[tmp] != Magic - row[x]) return;       if (!cnt[tmp]) return;       cnt[tmp]--;       t[x][y] = b[tmp];       if (!x) pd += b[tmp];       col[y] += b[tmp];       dfs2(x + 1, 0);       col[y] -= b[tmp];       if (!x) pd -= b[tmp];       cnt[tmp]++;     } else {       for (int i = 0; i < m; i++)         if (cnt[i]) {           cnt[i]--;           t[x][y] = b[i];           row[x] += b[i];           col[y] += b[i];           if (x == y) md += b[i];           if (x + y == n - 1) pd += b[i];           dfs2(x, y + 1);           if (x + y == n - 1) pd -= b[i];           if (x == y) md -= b[i];           col[y] -= b[i];           row[x] -= b[i];           cnt[i]++;         }     }   }