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