#include <bits/stdc++.h>
using namespace std;
int N, M, S;
int numbers[16];
vector<int> opts[1 << 18];
vector<int> options[16][4];
int tmp[4];
int optsc = 0;
void report() {
  for (int q = 0; q < (N); ++q) {
    opts[optsc].push_back(tmp[q]);
  }
  for (int i = 0; i < (N); ++i) {
    options[tmp[i]][i].push_back(optsc);
  }
  ++optsc;
}
void go0(int d) {
  if (d == N) {
    int x = 0;
    for (int i = 0; i < (N); ++i) x += numbers[tmp[i]];
    if (x == S) {
      report();
    }
    return;
  }
  for (int i = 0; i < (M); ++i) {
    bool ok = true;
    for (int j = 0; j < (d); ++j)
      if (tmp[j] == i) ok = false;
    if (!ok) continue;
    tmp[d] = i;
    go0(d + 1);
  }
}
int square[4][4];
bool used[16];
int prevv[16];
bool go(int isrow = 1, int which = 0) {
  int row = which, col = which;
  if (isrow && (which == 0)) {
    for (int i = 0; i < (M); ++i)
      for (__typeof((options[i][0]).begin()) it = (options[i][0]).begin();
           it != (options[i][0]).end(); ++it) {
        vector<int>& option = opts[*it];
        for (int k = 0; k < (N); ++k) {
          square[0][k] = option[k];
          used[square[0][k]] = true;
        }
        if (go(0, 0)) return true;
        for (int k = 0; k < (N); ++k) {
          used[square[0][k]] = false;
        }
      }
  } else if (!isrow && which == N - 1) {
    int s1 = 0, s2 = 0, s3 = 0;
    for (int i = 0; i < (N); ++i)
      s1 += numbers[square[i][i]], s2 += numbers[square[i][N - 1 - i]];
    return (s1 == S && s2 == S);
  } else if (isrow) {
    int i = square[which][0];
    for (__typeof((options[i][0]).begin()) it = (options[i][0]).begin();
         it != (options[i][0]).end(); ++it) {
      vector<int>& option = opts[*it];
      bool ok = true;
      for (int k = 0; k < (row); ++k)
        if (option[k] != square[row][k]) ok = false;
      for (int k = (row); k < (N); ++k)
        if (used[option[k]] ||
            (prevv[option[k]] >= 0 && !used[prevv[option[k]]])) {
          ok = false;
        }
      if (!ok) continue;
      for (int k = (row); k < (N); ++k) {
        square[row][k] = option[k];
        used[square[row][k]] = true;
      }
      if (go(0, which)) return true;
      for (int k = (row); k < (N); ++k) {
        used[square[row][k]] = false;
      }
    }
  } else if (!isrow) {
    int i = square[0][col];
    for (__typeof((options[i][0]).begin()) it = (options[i][0]).begin();
         it != (options[i][0]).end(); ++it) {
      vector<int>& option = opts[*it];
      bool ok = true;
      for (int k = 0; k < (col + 1); ++k)
        if (option[k] != square[k][col]) {
          ok = false;
        }
      for (int k = (col + 1); k < (N); ++k) {
        if (used[option[k]] ||
            (prevv[option[k]] >= 0 && !used[prevv[option[k]]])) {
          ok = false;
        }
      }
      if (!ok) continue;
      for (int k = (row); k < (N); ++k) {
        square[k][col] = option[k];
        used[square[k][col]] = true;
      }
      if (go(1, which + 1)) return true;
      for (int k = (row); k < (N); ++k) {
        used[square[k][col]] = false;
      }
    }
  }
  return false;
}
int main() {
  scanf("%d", &N);
  M = N * N;
  S = 0;
  for (int i = 0; i < (M); ++i) {
    scanf("%d", &numbers[i]);
    S += numbers[i];
  }
  sort(numbers, numbers + M);
  for (int i = 0; i < (M); ++i)
    if (i == 0 || numbers[i - 1] < numbers[i])
      prevv[i] = -1;
    else
      prevv[i] = i - 1;
  S /= N;
  go0(0);
  go();
  printf("%d\n", S);
  for (int i = 0; i < (N); ++i) {
    for (int j = 0; j < (N); ++j) printf("%d ", numbers[square[i][j]]);
    printf("\n");
  }
}
