#include <bits/stdc++.h>
using namespace std;
FILE *in;
FILE *out;
int n;
int vis, goal;
int s[8], d[8];
int a[8 * 8];
int board[8][8];
vector<int> sums[65536];
int find(int num) {
  int left = 0, right = (int)sums[vis].size() - 1;
  while (left <= right) {
    int mid = (left + right) / 2;
    if (sums[vis][mid] == num) return 1;
    if (sums[vis][mid] < num)
      left = mid + 1;
    else
      right = mid - 1;
  }
  return 0;
}
int recurse(int row, int col, int csum) {
  if (col > 0 && row >= n - 1)
    if (d[1] != goal) return 0;
  if (row == n - 1 && col == n - 1) {
    int idx = 0;
    while (vis & (1 << idx)) idx++;
    board[row][col] = a[idx];
    if (csum + a[idx] != goal) return 0;
    if (s[col] + a[idx] != goal) return 0;
    if (d[0] + a[idx] != goal) return 0;
    return 1;
  }
  if (row == n - 1) {
    for (int i = 0; i < n * n; i++) {
      if ((vis & (1 << i)) == 0 && s[col] + a[i] == goal) {
        board[row][col] = a[i];
        vis |= (1 << i);
        s[col] += a[i];
        if (row == col) d[0] += a[i];
        if (row == n - col - 1) d[1] += a[i];
        int ans = recurse(row, col + 1, csum + a[i]);
        if (row == n - col - 1) d[1] -= a[i];
        if (row == col) d[0] -= a[i];
        vis ^= (1 << i);
        s[col] -= a[i];
        return ans;
      }
    }
    return 0;
  }
  if (col == n - 1) {
    for (int i = 0; i < n * n; i++) {
      if ((vis & (1 << i)) == 0 && csum + a[i] == goal) {
        board[row][col] = a[i];
        vis |= (1 << i);
        s[col] += a[i];
        if (row == col) d[0] += a[i];
        if (row == n - col - 1) d[1] += a[i];
        int ans = recurse(row + 1, 0, 0);
        if (row == n - col - 1) d[1] -= a[i];
        if (row == col) d[0] -= a[i];
        vis ^= (1 << i);
        s[col] -= a[i];
        return ans;
      }
    }
    return 0;
  }
  for (int i = 0; i < n * n; i++)
    if ((vis & (1 << i)) == 0) {
      int flag = 1;
      if (flag && n - row == 3 && !find(goal - s[col] - a[i]))
        flag = 0;
      else if (flag && n - col == 3 && !find(goal - csum - a[i]))
        flag = 0;
      else if (flag && n - row == 3 && row == col && !find(goal - d[0] - a[i]))
        flag = 0;
      else if (flag && n - row == 3 && row == n - col - 1 &&
               !find(goal - d[1] - a[i]))
        flag = 0;
      else {
        board[row][col] = a[i];
        vis |= (1 << i);
        s[col] += a[i];
        if (row == col) d[0] += a[i];
        if (row == n - col - 1) d[1] += a[i];
        int ans = recurse(row, col + 1, csum + a[i]);
        if (row == n - col - 1) d[1] -= a[i];
        if (row == col) d[0] -= a[i];
        vis ^= (1 << i);
        s[col] -= a[i];
        if (ans) return 1;
      }
    }
  return 0;
}
void precalc() {
  for (int mask = 0; mask < (1 << (n * n)); mask++) {
    for (int i = 0; i < n * n; i++)
      if ((mask & (1 << i)) == 0)
        for (int c = i + 1; c < n * n; c++)
          if ((mask & (1 << c)) == 0) sums[mask].push_back(a[i] + a[c]);
    sort(sums[mask].begin(), sums[mask].end());
    sums[mask].resize(unique(sums[mask].begin(), sums[mask].end()) -
                      sums[mask].begin());
  }
}
int main(void) {
  in = stdin;
  out = stdout;
  fscanf(in, "%d", &n);
  for (int i = 0; i < n * n; i++) fscanf(in, "%d", &a[i]);
  if (n == 1) {
    fprintf(out, "%d\n", a[0]);
    fprintf(out, "%d\n", a[0]);
    return 0;
  }
  precalc();
  goal = 0;
  vis = 0;
  d[0] = d[1] = 0;
  s[0] = s[1] = s[2] = s[3] = 0;
  for (int i = 0; i < n * n; i++) goal += a[i];
  goal /= n;
  recurse(0, 0, 0);
  fprintf(out, "%d\n", goal);
  for (int i = 0; i < n; i++)
    for (int c = 0; c < n; c++)
      fprintf(out, "%d%c", board[i][c], c + 1 == n ? '\n' : ' ');
  return 0;
}
