#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[y] += 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;   }   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;   int num[N * N];   bool check(int cnt, int sum) {     if (cnt == n) return (sum == need);     if (cnt == n - 1) {       for (int i = 0; i < tot; i++)         if (!vis[i] && sum + v[i] == need) return 1;       return 0;     }     if (cnt == n - 2) {       int p = 0, x = need - sum;       ;       for (int i = 0; i < tot; i++)         if (!vis[i]) num[p++] = v[i];       int l = 0, r = p - 1;       while (l < r) {         int tmp = num[l] + num[r];         if (tmp == x) return 1;         if (tmp < x) l++;         if (tmp > x) r--;       }       return 0;     }     return 1;   }   bool validate() {     if (!check(cd1, dia1)) return 0;     if (!check(cd2, dia2)) return 0;     for (int i = 1; i <= n; i++) {       if (!check(cr[i], row[i])) return 0;       if (!check(cc[i], col[i])) return 0;     }     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 (validate() && dfs1(xx, yy)) return 1;       insert(x, y, i, -1);     }     return 0;   }   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();     }   }