#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T min(T &a, T &b) {
  return a < b ? a : b;
}
template <class T>
inline T max(T &a, T &b) {
  return a > b ? a : b;
}
template <class T>
void read(T &x) {
  char ch;
  while ((ch = getchar()) && !isdigit(ch))
    ;
  x = ch - '0';
  while ((ch = getchar()) && isdigit(ch)) x = x * 10 + ch - '0';
}
struct point {
  int x, y;
  point() {}
  point(int _x, int _y) : x(_x), y(_y) {}
};
long long sum, a[5][5], w[100];
int n, vis[100], Cnt[100];
inline void nxt(int &x, int &y) {
  y++;
  if (y > n) y = 1, x++;
}
inline void bef(int &x, int &y) {
  y--;
  if (y == 0) x--, y = n;
}
inline void print() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) printf("%I64d ", a[i][j]);
    puts("");
  }
}
inline long long calc_row(int x, int y) {
  long long ans = 0;
  while (y - 1 > 0) y--, ans += a[x][y];
  return ans;
}
inline long long calc_col(int x, int y) {
  long long ans = 0;
  while (x - 1 > 0) x--, ans += a[x][y];
  return ans;
}
inline long long calc_dia(int x, int y) {
  long long ans = 0;
  if (x == n && y == n) {
    while (x - 1 > 0) x--, y--, ans += a[x][y];
    return ans;
  }
  while (x - 1 > 0) x--, y++, ans += a[x][y];
  return ans;
}
void dfs(int x, int y) {
  if (x > n) {
    print();
    exit(0);
  }
  if (x == n && y == n) {
    long long s1 = calc_row(x, y), s2 = calc_col(x, y), s3 = calc_dia(x, y);
    if (s1 != s2 || s1 != s3 || s2 != s3) return;
    for (int i = 1; i <= n * n; i++)
      if (w[i] == sum - s1 && !vis[i]) {
        a[x][y] = w[i];
        vis[i] = 1;
        nxt(x, y);
        dfs(x, y);
        bef(x, y);
        a[x][y] = 0;
        vis[i] = 0;
        break;
      } else if (w[i] > sum - s1)
        break;
    return;
  }
  if (y == n) {
    long long s1 = calc_row(x, y);
    for (int i = 1; i <= n * n; i++)
      if (w[i] == sum - s1 && !vis[i]) {
        a[x][y] = w[i];
        vis[i] = 1;
        nxt(x, y);
        dfs(x, y);
        bef(x, y);
        a[x][y] = 0;
        vis[i] = 0;
        break;
      } else if (w[i] > sum - s1)
        break;
    return;
  }
  if (x == n && y == 1) {
    long long s1 = calc_col(x, y), s2 = calc_dia(x, y);
    if (s1 != s2) return;
    for (int i = 1; i <= n * n; i++)
      if (w[i] == sum - s1 && !vis[i]) {
        a[x][y] = w[i];
        vis[i] = 1;
        nxt(x, y);
        dfs(x, y);
        bef(x, y);
        a[x][y] = 0;
        vis[i] = 0;
        break;
      } else if (w[i] > sum - s1)
        break;
    return;
  }
  if (x == n) {
    long long s1 = calc_col(x, y);
    for (int i = 1; i <= n * n; i++)
      if (w[i] == sum - s1 && !vis[i]) {
        a[x][y] = w[i];
        vis[i] = 1;
        nxt(x, y);
        dfs(x, y);
        bef(x, y);
        a[x][y] = 0;
        vis[i] = 0;
        break;
      } else if (w[i] > sum - s1)
        break;
    return;
  }
  for (int i = 1; i <= n * n; i++)
    if (!vis[i]) {
      if (x == n - 1) {
        long long s1 = calc_col(x, y);
        int flag = 0;
        for (int j = 1; j <= n * n; j++)
          if (w[j] == sum - s1 - w[i] && !vis[j]) {
            flag = 1;
            break;
          } else if (w[j] > sum - s1 - w[i])
            break;
        if (!flag) continue;
      }
      if (y == n - 1) {
        long long s1 = calc_row(x, y);
        int flag = 0;
        for (int j = 1; j <= n * n; j++)
          if (w[j] == sum - s1 - w[i] && !vis[j]) {
            flag = 1;
            break;
          } else if (w[j] > sum - s1 - w[i])
            break;
        if (!flag) continue;
      }
      a[x][y] = w[i];
      vis[i] = 1;
      nxt(x, y);
      dfs(x, y);
      bef(x, y);
      a[x][y] = 0;
      vis[i] = 0;
    }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n * n; i++) scanf("%I64d", &w[i]);
  sort(w + 1, w + n * n + 1);
  for (int i = 1; i <= n * n; i++) sum += w[i];
  sum /= n;
  printf("%I64d\n", sum);
  dfs(1, 1);
}
