#include <bits/stdc++.h>
using namespace std;
vector<int> A;
vector<bool> used;
int N, S;
pair<int, int> chk[10][4] = {
    {make_pair(0, 0), make_pair(0, 1), make_pair(0, 3), make_pair(0, 2)},
    {make_pair(1, 0), make_pair(1, 1), make_pair(1, 2), make_pair(1, 3)},
    {make_pair(2, 0), make_pair(2, 1), make_pair(2, 2), make_pair(2, 3)},
    {make_pair(3, 0), make_pair(3, 1), make_pair(3, 3), make_pair(3, 2)},
    {make_pair(0, 0), make_pair(1, 0), make_pair(3, 0), make_pair(2, 0)},
    {make_pair(0, 1), make_pair(1, 1), make_pair(2, 1), make_pair(3, 1)},
    {make_pair(0, 2), make_pair(1, 2), make_pair(2, 2), make_pair(3, 2)},
    {make_pair(0, 3), make_pair(1, 3), make_pair(3, 3), make_pair(2, 3)},
    {make_pair(0, 0), make_pair(1, 1), make_pair(2, 2), make_pair(3, 3)},
    {make_pair(0, 3), make_pair(2, 1), make_pair(1, 2), make_pair(3, 0)}};
vector<int> trychk[4][4];
bool sol = 0, added;
int B[4][4];
map<int, int> freq;
int mx[16] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 1, 1, 2, 2, 3, 3};
int my[16] = {0, 1, 2, 3, 3, 2, 1, 0, 1, 2, 0, 3, 0, 3, 1, 2};
void dfs(int lv) {
  int first = mx[lv], second = my[lv];
  if (lv == N * N) {
    printf("%d\n", S);
    for (int i = (0); i < (4); ++i)
      for (int j = (0); j < (4); ++j)
        printf("%d%c", B[i][j], j == N - 1 ? '\n' : ' ');
    sol = 1;
  } else if (trychk[first][second].size() == 0) {
    for (int i = (0); i < (N * N); ++i)
      if (!used[i]) {
        B[first][second] = A[i];
        used[i] = 1;
        dfs(lv + 1);
        if (sol) return;
        used[i] = 0;
      }
  } else {
    int s = 0, ts;
    bool cons = 1;
    for (int i = (0); i < (trychk[first][second].size()) && (cons); ++i) {
      s = 0;
      for (int j = (0); j < (3); ++j) {
        int p = trychk[first][second][i];
        s += B[chk[p][j].first][chk[p][j].second];
      }
      if (!i)
        ts = S - s;
      else
        cons &= ts == S - s;
    }
    if (cons)
      for (int i = (0); i < (N * N); ++i)
        if (A[i] == ts && !used[i]) {
          used[i] = 1;
          B[first][second] = A[i];
          dfs(lv + 1);
          if (sol) return;
          used[i] = 0;
          break;
        }
  }
}
int main(int argc, char **argv) {
  S = 0;
  added = 0;
  for (int i = (0); i < (10); ++i)
    trychk[chk[i][3].first][chk[i][3].second].push_back(i);
  cin >> N;
  A = vector<int>(N * N);
  used = vector<bool>(N * N, 0);
  for (int i = (0); i < (N * N); ++i) cin >> A[i], freq[A[i]]++, S += A[i];
  S /= N;
  sort(A.begin(), A.end());
  if (N <= 3) {
    sort(A.begin(), A.end());
    do {
      int B[N][N];
      for (int i = (0); i < (N); ++i)
        for (int j = (0); j < (N); ++j) B[i][j] = A[N * i + j];
      bool ok = 1;
      int tsum = 0;
      for (int i = (0); i < (N); ++i) tsum += B[i][0];
      for (int i = (0); i < (N) && (ok); ++i) {
        int s = 0;
        for (int j = (0); j < (N); ++j) s += B[i][j];
        ok &= tsum == s;
        s = 0;
        for (int j = (0); j < (N); ++j) s += B[j][i];
        ok &= tsum == s;
      }
      int ss = 0;
      for (int i = (0); i < (N) && (ok); ++i) ss += B[i][i];
      ok &= ss == tsum;
      ss = 0;
      for (int i = (0); i < (N) && (ok); ++i) ss += B[N - i - 1][i];
      ok &= ss == tsum;
      if (ok) {
        cout << tsum << endl;
        for (int i = (0); i < (N); ++i)
          for (int j = (0); j < (N); ++j)
            printf("%d%c", B[i][j], j == N - 1 ? '\n' : ' ');
        break;
      }
    } while (next_permutation(A.begin(), A.end()));
  } else {
    dfs(0);
  }
  return 0;
}
