#include <bits/stdc++.h>   using namespace std;   const int N = 6;   const int M = 10010;   const int K = 510;   const int LIT = 2500;   const int INF = 1 << 30;   int n, m[N][N], tot, need;   vector<int> v, vis;   int row[N], col[N], dia1, dia2;   int cr[N], cc[N], cd1, cd2;   void init() {     memset(m, 0, sizeof(m));     memset(row, 0, sizeof(row));     memset(col, 0, sizeof(col));     dia1 = dia2 = 0;     memset(cr, 0, sizeof(cr));     memset(cc, 0, sizeof(cc));     cd1 = cd2 = 0;     tot = n * n;     need = 0;     v = vector<int>(n * n);     vis = vector<int>(n * n);     for (int i = 0; i < tot; i++) cin >> v[i];     sort(v.begin(), v.end());     for (int i = 0; i < tot; i++) need += v[i];     need /= n;   }   void insert(int x, int y, int p, int ord) {     m[x][y] = v[p];     vis[p] = (ord > 0) ? 1 : 0;     int tmp = v[p] * ord;     row[x] += tmp;     cr[x] += ord;     col[y] += tmp;     cc[x] += ord;     if (x == y) dia1 += tmp, cd1 += ord;     if (x + y == n + 1) dia2 += tmp, cd2 += ord;   }   void out(int sum) {     printf( %d n , sum);     for (int i = 1; i <= n; i++) {       for (int j = 1; j <= n; j++) printf( %d  , m[i][j]);       printf(  n );     }   }   bool check() {     int sum = dia1;     for (int i = 1; i <= n; i++)       if (sum != row[i]) return 0;     for (int i = 1; i <= n; i++)       if (sum != col[i]) return 0;     if (dia1 != dia2) return 0;     out(sum);     return 1;   }   bool dfs1(int x, int y) {     if (x > n) return check();     int xx = x, yy = y + 1;     if (yy > n) xx++, yy = 1;     for (int i = 0; i < tot; i++) {       if (vis[i]) continue;       insert(x, y, i, 1);       if (dfs1(xx, yy)) return 1;       insert(x, y, i, -1);     }     return 0;   }   const int nxt[][2] = {{1, 1}, {1, 2}, {1, 3}, {2, 1}, {3, 1}, {1, 4},                         {4, 1}, {2, 2}, {3, 3}, {4, 4}, {2, 3}, {2, 4},                         {3, 2}, {3, 4}, {4, 2}, {4, 3}};   const int bnd = 16;   pair<long long, long long> getmax2() {     pair<long long, long long> ret = make_pair(-INF, -INF);     for (int i = 0; i < tot; i++) {       if (vis[i]) continue;       if (ret.first < v[i]) {         swap(ret.first, ret.second);         ret.first = v[i];       } else if (ret.second < v[i])         ret.second = v[i];     }     return ret;   }   bool validate() {     pair<long long, long long> now = getmax2();     for (int i = 1; i <= n; i++) {       if (cr[i] == 3) {         bool f = 0;         for (int j = 0; j < tot; j++)           if (!vis[j] && row[i] + v[j] == need) f = 1;         if (!f) return 0;       }       if (cc[i] == 3) {         bool f = 0;         for (int j = 0; j < tot; j++)           if (!vis[j] && col[i] + v[j] == need) f = 1;         if (!f) return 0;       }     }     if (cd1 == 3) {       bool f = 0;       for (int i = 0; i < tot; i++)         if (!vis[i] && dia1 + v[i] == need) f = 1;       if (!f) return 0;     }     if (cd2 == 3) {       bool f = 0;       for (int i = 0; i < tot; i++)         if (!vis[i] && dia2 + v[i] == need) f = 1;       if (!f) return 0;     }     return 1;   }   bool dfs(int p) {     if (p > bnd) return check();     int x = nxt[p][0], y = nxt[p][1];     for (int i = 0; i < tot; i++) {       if (vis[i]) continue;       insert(x, y, i, 1);       if (validate() && dfs(p + 1)) return 1;       insert(x, y, i, -1);     }     return 0;   }   void solve() {     if (n <= 3)       dfs1(1, 1);     else       dfs(0);   }   int main() {     while (cin >> n) {       init();       solve();     }   }