#include<iostream>
#include <vector>
#include <climits>
#include <string>
#include <iosfwd>
#include <limits>

using namespace std;

int main()
{
	std::vector<int> numbers;
	std::vector<int> ordinary;
	int number;
	int n, minimumCurrent, minimum = 0, indexMin, currentNumber, indexPrint, indexPrintMax;
	bool found;
	bool first = false;
	cin >> n;

	for (int i = 1; i <= n*n; i++)
	{
		cin >> number;
		if (number <= minimum && numbers.size() == n)
		{
			ordinary.push_back(number);
		}
		else
		{
			found = false;
			minimumCurrent = std::numeric_limits<int>::max();
			for (int j = 0; j < numbers.size(); j++)
			{
				currentNumber = numbers.at(j);
				if (currentNumber == minimum)
				{
					indexMin = j;
					found = true;
				}
				if (currentNumber < minimumCurrent)
				{
					minimumCurrent = currentNumber;
				}
			}

			if (found && numbers.size() == n)
			{
				ordinary.push_back(numbers.at(indexMin));
				numbers.erase(numbers.begin() + indexMin);

				minimumCurrent = std::numeric_limits<int>::max();
				for (int j = 0; j < numbers.size(); j++)
				{
					currentNumber = numbers.at(j);
					if (currentNumber < minimumCurrent)
					{
						minimumCurrent = currentNumber;
					}
				}
				minimum = minimumCurrent;
			}

			if (number < minimum)
			{
				minimum = number;
			}

			if (first == false)
			{
				minimum = number;
				first = true;
			}

			numbers.push_back(number);
		}
	}

	indexPrintMax = 0;
	indexPrint = 0;

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (i == j)
			{
				cout << numbers.at(indexPrintMax) << " ";
				indexPrintMax++;
			}
			else
			{
				cout << ordinary.at(indexPrint) << " ";
				indexPrint++;
			}
		}
		cout << endl;
	}

	system("PAUSE");
	return 0;
}