#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize("Ofast", "-funroll-loops", "-fdelete-null-pointer-checks")
#pragma GCC target("ssse3", "sse3", "sse2", "sse", "avx2", "avx")
#pragma GCC optimize(3, "Ofast", "inline")
#define foru(i, k, n) for (int i = k; i < n; i++)
#define ford(i, k, n) for (int i = k; i >= n; i--)
#include <bits/stdc++.h>
#define fast ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define SIZE 500000
#define INF 1e15
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
/***********************************************************************************/
ll n, m, temp, t = 1;
vector<ll> a;
vector<vector<ll>> grid;

bool good(ll i, ll j) {
	return (i >= 0 and i < n and j >= 0 and j < n and grid[i][j] == -1);
}

bool dfs(ll num, ll i, ll j, ll left) {
	grid[i][j] = num;
	if (left == 0) return true;
	if (good(i, j - 1)) return dfs(num, i, j - 1, left - 1);
	else if (good(i + 1, j)) return dfs(num, i + 1, j, left - 1);
	return false;
}

int main() {
	fast;
	//cin >> t;
	while (t--) {
		cin >> n;
		a.resize(n), grid.resize(n);
		for (ll i = 0; i < n; i++)
		{
			grid[i].resize(n, - 1);
			cin >> a[i];
			grid[i][i] = a[i];
		}
		bool res = true;
		for (ll i = 0; i < n; i++) res &= dfs(a[i], i, i, a[i] - 1);
		if (!res) cout << "-1\n";
		else {
			for (auto& row : grid) {
				for (auto x : row) if (x != -1) cout << x << ' ';
				cout << '\n';
			}
		}
	}
}