import java.util.*;
class Program {
static void fill(List<Pair<Integer, Integer>> temp, PriorityQueue<Pair<Integer, Integer>> q, int[][] grid) {
Pair<Integer, Integer> it = q.peek();
q.poll();
if (it.getFirst() < temp.size()) {
System.out.println("No");
System.exit(0);
}
for (Pair<Integer, Integer> c : temp) {
grid[c.getFirst()][c.getSecond()] = it.getSecond();
}
it.setFirst(it.getFirst() - temp.size());
q.offer(it);
}
static void checkPalindrome(int[] A, int N) {
Map<Integer, Integer> mp = new HashMap<>();
PriorityQueue<Pair<Integer, Integer>> q = new PriorityQueue<>(Collections.reverseOrder(Comparator.comparing(Pair::getFirst)));
int[][] grid = new int[N][N];
for (int c = 0; c < N * N; c++) {
mp.put(A[c], mp.getOrDefault(A[c], 0) + 1);
}
for (Map.Entry<Integer, Integer> entry : mp.entrySet()) {
q.offer(new Pair<>(entry.getValue(), entry.getKey()));
}
int m = N / 2;
List<Pair<Integer, Integer>> temp = new ArrayList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
int revI = N - i - 1;
int revJ = N - j - 1;
temp.addAll(Arrays.asList(
new Pair<>(i, j),
new Pair<>(revI, j),
new Pair<>(i, revJ),
new Pair<>(revI, revJ)
));
fill(temp, q, grid);
temp.clear();
}
}
if (N % 2 == 1) {
for (int i = 0; i < m; i++) {
temp.addAll(Arrays.asList(
new Pair<>(i, m),
new Pair<>(N - i - 1, m)
));
fill(temp, q, grid);
temp.clear();
temp.addAll(Arrays.asList(
new Pair<>(m, i),
new Pair<>(m, N - i - 1)
));
fill(temp, q, grid);
temp.clear();
}
temp.add(new Pair<>(m, m));
fill(temp, q, grid);
}
System.out.println("Yes");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(grid[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
int[] A = {1, 1, 1, 1, 2, 3, 3, 4, 4};
int N = (int) Math.sqrt(A.length);
checkPalindrome(A, N);
}
}
class Pair<K, V> {
private K first;
private V second;
Pair(K first, V second) {
this.first = first;
this.second = second;
}
K getFirst() {
return first;
}
void setFirst(K first) {
this.first = first;
}
V getSecond() {
return second;
}
void setSecond(V second) {
this.second = second;
}
}