#include <bits/stdc++.h>
using namespace std;
const int maxn = 4;
int sp;
int n;
map<int, int> mp;
int a[maxn][maxn];
int mark[maxn][maxn];
int s;
struct dastur {
  int typ;
  pair<int, int> tar;
  pair<int, int> x;
  pair<int, int> y;
  pair<int, int> z;
  dastur(int ty = 0, pair<int, int> tr = pair<int, int>(0, 0),
         pair<int, int> xx = pair<int, int>(0, 0),
         pair<int, int> yy = pair<int, int>(0, 0),
         pair<int, int> zz = pair<int, int>(0, 0)) {
    typ = ty;
    tar = tr;
    x = xx;
    y = yy;
    z = zz;
  }
};
vector<dastur> vec;
void output() {
  cout << s << endl;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) cout << a[i][j] << " ";
    cout << endl;
  }
  exit(0);
}
int ttt;
void bt(int now) {
  if (now == 3)
    if (a[0][0] != sp && a[1][1] != sp && a[0][1] != sp) return;
  if (now == (int)(vec).size()) output();
  vector<int> ve;
  if (vec[now].typ == 0) {
    for (typeof(mp.begin()) it = mp.begin(); it != mp.end(); ++it) {
      if (!it->second) continue;
      int val = it->first;
      ve.push_back(val);
    }
    for (int i = 0; i < (int)(ve).size(); ++i) {
      int val = ve[i];
      mp[val]--;
      a[vec[now].tar.first][vec[now].tar.second] = val;
      bt(now + 1);
      mp[val]++;
    }
  } else {
    if (vec[now].typ == 1) {
      int val = s - (a[vec[now].x.first][vec[now].x.second] +
                     a[vec[now].y.first][vec[now].y.second] +
                     a[vec[now].z.first][vec[now].z.second]);
      if (!mp[val]) {
        mp.erase(val);
        return;
      }
      mp[val]--;
      a[vec[now].tar.first][vec[now].tar.second] = val;
      bt(now + 1);
      mp[val]++;
    }
    if (vec[now].typ == 2) {
      int val = (a[vec[now].tar.first][vec[now].tar.second] +
                 a[vec[now].x.first][vec[now].x.second] +
                 a[vec[now].y.first][vec[now].y.second] +
                 a[vec[now].z.first][vec[now].z.second]);
      if (val != s) return;
      bt(now + 1);
    }
  }
}
void check() {
  a[2][0] = s - a[0][0] - a[1][0];
  if (!mp[a[2][0]]) return;
  a[2][2] = s - a[1][1] - a[0][0];
  if (!mp[a[2][2]]) return;
  a[0][2] = s - a[0][0] - a[0][1];
  if (!mp[a[0][2]]) return;
  a[1][2] = s - a[1][0] - a[1][1];
  if (!mp[a[1][2]]) return;
  a[2][1] = s - a[0][1] - a[1][1];
  if (!mp[a[2][0]]) return;
  if (a[2][1] + a[2][0] + a[2][2] != s) return;
  if (a[1][2] + a[0][2] + a[2][2] != s) return;
  if (a[0][2] + a[2][0] + a[1][1] != s) return;
  output();
}
void bt2(int x, int y) {
  vector<int> ve;
  if (x == n - 1) {
    y++;
    x = 0;
  }
  if (y == n - 1) return check();
  for (typeof(mp.begin()) it = mp.begin(); it != mp.end(); ++it) {
    if (!it->second) continue;
    int val = it->first;
    ve.push_back(val);
  }
  for (int i = 0; i < (int)(ve).size(); ++i) {
    int val = ve[i];
    mp[val]--;
    a[x][y] = val;
    bt2(x + 1, y);
    mp[val]++;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  int t1;
  for (int i = 0; i < n * n; ++i) {
    cin >> t1;
    if (!i) sp = t1;
    mp[t1]++;
    s += t1;
  }
  s /= n;
  if (n == 4) {
    vec.push_back(dastur(0, pair<int, int>(0, 0)));
    vec.push_back(dastur(0, pair<int, int>(0, 1)));
    vec.push_back(dastur(0, pair<int, int>(1, 1)));
    vec.push_back(dastur(0, pair<int, int>(0, 2)));
    vec.push_back(dastur(1, pair<int, int>(0, 3), pair<int, int>(0, 2),
                         pair<int, int>(0, 1), pair<int, int>(0, 0)));
    vec.push_back(dastur(0, pair<int, int>(2, 2)));
    vec.push_back(dastur(1, pair<int, int>(3, 3), pair<int, int>(2, 2),
                         pair<int, int>(1, 1), pair<int, int>(0, 0)));
    vec.push_back(dastur(0, pair<int, int>(1, 2)));
    vec.push_back(dastur(1, pair<int, int>(3, 2), pair<int, int>(2, 2),
                         pair<int, int>(1, 2), pair<int, int>(0, 2)));
    vec.push_back(dastur(0, pair<int, int>(2, 1)));
    vec.push_back(dastur(1, pair<int, int>(3, 1), pair<int, int>(2, 1),
                         pair<int, int>(1, 1), pair<int, int>(0, 1)));
    vec.push_back(dastur(1, pair<int, int>(3, 0), pair<int, int>(2, 1),
                         pair<int, int>(1, 2), pair<int, int>(0, 3)));
    vec.push_back(dastur(2, pair<int, int>(3, 0), pair<int, int>(3, 1),
                         pair<int, int>(3, 2), pair<int, int>(3, 3)));
    vec.push_back(dastur(0, pair<int, int>(1, 0)));
    vec.push_back(dastur(1, pair<int, int>(2, 0), pair<int, int>(3, 0),
                         pair<int, int>(1, 0), pair<int, int>(0, 0)));
    vec.push_back(dastur(1, pair<int, int>(1, 3), pair<int, int>(1, 1),
                         pair<int, int>(1, 2), pair<int, int>(1, 0)));
    vec.push_back(dastur(1, pair<int, int>(2, 3), pair<int, int>(2, 1),
                         pair<int, int>(2, 2), pair<int, int>(2, 0)));
    vec.push_back(dastur(2, pair<int, int>(0, 3), pair<int, int>(1, 3),
                         pair<int, int>(2, 3), pair<int, int>(3, 3)));
    bt(0);
  } else {
    if (n == 1) {
      a[0][0] = s;
      output();
    }
    if (n == 2) {
      a[0][1] = t1;
      a[1][1] = s - t1;
      a[1][0] = t1;
      a[0][0] = s - t1;
      output();
    }
    bt2(0, 0);
  }
  return 0;
}
