#include <bits/stdc++.h>
using namespace std;
static const int INF = 1000000000;
template <class T>
void debug(T a, T b) {
  for (; a != b; ++a) cerr << *a << ' ';
  cerr << endl;
}
int n;
int num[20];
int buf[5][5], ans[5][5];
pair<int, int> kind[20];
int sum;
int m;
int check() {
  int tmp;
  for (int i = 0; i < n; ++i) {
    tmp = 0;
    for (int j = 0; j < n; ++j) {
      if (buf[i][j] == -INF) goto ex1;
      tmp += buf[i][j];
    }
    if (tmp != sum) return 1;
  }
ex1:;
  for (int i = 0; i < n; ++i) {
    tmp = 0;
    for (int j = 0; j < n; ++j) {
      if (buf[j][i] == -INF) goto ex2;
      tmp += buf[j][i];
    }
    if (tmp != sum) return 1;
  }
ex2:;
  tmp = 0;
  for (int i = 0; i < n; ++i) {
    if (buf[i][i] == -INF) goto ex3;
    tmp += buf[i][i];
  }
  if (tmp != sum) return 1;
ex3:;
  tmp = 0;
  for (int i = 0; i < n; ++i) {
    if (buf[i][n - 1 - i] == -INF) goto ex4;
    tmp += buf[i][n - 1 - i];
  }
  if (tmp != sum) return 1;
ex4:;
  return 0;
}
int dfs(int x, int y) {
  if (x == n) {
    x = 0;
    ++y;
  }
  if (check()) return 0;
  if (y == n) {
    memcpy(ans, buf, sizeof(ans));
    return 1;
  }
  for (int i = 0; i < m; ++i)
    if (kind[i].second > 0) {
      buf[y][x] = kind[i].first;
      --kind[i].second;
      if (dfs(x + 1, y)) return 1;
      buf[y][x] = -INF;
      ++kind[i].second;
    }
  return 0;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j) buf[i][j] = -INF;
  for (int i = 0; i < n * n; ++i) scanf("%d", &num[i]);
  sort(num, num + n * n);
  sum = accumulate(num, num + n * n, 0) / n;
  m = 0;
  for (int i = 0; i < n * n; ++i) {
    int j = i;
    while (j < n * n && num[j] == num[i]) ++j;
    kind[m++] = make_pair(num[i], j - i);
    i = j - 1;
  }
  dfs(0, 0);
  printf("%d\n", sum);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      printf("%d%c", ans[i][j], j == n - 1 ? '\n' : ' ');
  return 0;
}
