#include <bits/stdc++.h>
using namespace std;
int n, c = 0;
int a[16];
int rev[16], cnt[16];
map<int, int> dict;
int X[8] = {0, 1, 2, 0, 1, 2, 0, 3};
int Y[8] = {0, 0, 0, 1, 1, 1, 2, 2};
int s = 0;
bool fudge(int at) {
  if (at == 0 || at == 1 || at == 3 || at == 4) return true;
  if (at == 2) {
    a[3] = s - a[2] - a[1] - a[0];
    if (cnt[dict[a[3]]] == 0) {
      return false;
    } else {
      cnt[dict[a[3]]]--;
      return true;
    }
  }
  if (at == 5) {
    a[7] = s - a[6] - a[5] - a[4];
    if (cnt[dict[a[7]]] == 0) {
      return false;
    } else {
      cnt[dict[a[7]]]--;
      return true;
    }
  }
  if (at == 6) {
    a[12] = s - a[0] - a[4] - a[8];
    a[9] = s - a[12] - a[6] - a[3];
    a[13] = s - a[9] - a[5] - a[1];
    cnt[dict[a[12]]]--;
    cnt[dict[a[9]]]--;
    cnt[dict[a[13]]]--;
    if (cnt[dict[a[12]]] < 0 || cnt[dict[a[9]]] < 0 || cnt[dict[a[13]]] < 0) {
      cnt[dict[a[12]]]++;
      cnt[dict[a[9]]]++;
      cnt[dict[a[13]]]++;
      return false;
    }
    return true;
  }
  if (at == 7) {
    a[15] = s - a[3] - a[7] - a[11];
    a[10] = s - a[15] - a[5] - a[0];
    a[14] = s - a[13] - a[15] - a[12];
    cnt[dict[a[15]]]--;
    cnt[dict[a[10]]]--;
    cnt[dict[a[14]]]--;
    if (cnt[dict[a[15]]] < 0 || cnt[dict[a[10]]] < 0 || cnt[dict[a[14]]] < 0) {
      cnt[dict[a[15]]]++;
      cnt[dict[a[10]]]++;
      cnt[dict[a[14]]]++;
      return false;
    }
    return true;
  }
  assert(false);
  return false;
}
void antifudge(int at) {
  if (at == 0 || at == 1 || at == 3 || at == 4) return;
  if (at == 2) {
    cnt[dict[a[3]]]++;
  }
  if (at == 5) {
    cnt[dict[a[7]]]++;
  }
  if (at == 6) {
    cnt[dict[a[9]]]++;
    cnt[dict[a[12]]]++;
    cnt[dict[a[13]]]++;
  }
  if (at == 7) {
    cnt[dict[a[10]]]++;
    cnt[dict[a[14]]]++;
    cnt[dict[a[15]]]++;
  }
}
bool check() {
  for (int i = 0; i < n; i++) {
    int r1 = 0;
    for (int j = 0; j < n; j++) {
      r1 += a[n * i + j];
    }
    if (r1 != s) return false;
  }
  for (int i = 0; i < n; i++) {
    int r2 = 0;
    for (int j = 0; j < n; j++) {
      r2 += a[n * j + i];
    }
    if (r2 != s) return false;
  }
  int r1 = 0, r2 = 0;
  for (int i = 0; i < n; i++) {
    r1 += a[n * i + i];
    r2 += a[n * i + (n - 1 - i)];
  }
  return r1 == s && r2 == s;
}
bool dfs(int at) {
  if (at == 8) return check();
  for (int i = 1; i <= c; i++) {
    if (cnt[i] > 0) {
      a[X[at] + n * Y[at]] = rev[i];
      cnt[i]--;
      if (fudge(at)) {
        if (dfs(at + 1)) return true;
        antifudge(at);
      }
      cnt[i]++;
    }
  }
  return false;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n * n; i++) {
    scanf("%d", &a[i]);
    if (!dict[a[i]]) {
      dict[a[i]] = ++c;
      rev[c] = a[i];
    }
    cnt[dict[a[i]]]++;
    s += a[i];
  }
  s /= n;
  printf("%d\n", s);
  sort(a, a + n * n);
  if (n <= 3) {
    do {
      if (check()) {
        for (int i = 0; i < n; i++) {
          for (int j = 0; j < n; j++) {
            printf("%d ", a[n * i + j]);
          }
          printf("\n");
        }
        return 0;
      }
    } while (next_permutation(a, a + n * n));
  } else {
    dfs(0);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        printf("%d ", a[n * i + j]);
      }
      printf("\n");
    }
  }
}
