#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]++;
      }
  }
}
