#include <iostream>
#include <assert.h> 
#include <stdlib.h> 
using namespace std;

class TriMat {
	private:
		int Size;	
		int** M;
	public:
		TriMat(int n) {
			Size = n;
			M = (int**) malloc(Size * sizeof(int));
			for (int k = 0; k < Size; k++) {
				M[k] = (int*) malloc((Size - k) * sizeof(int));
				for (int j = 0; j <= Size - 1 - k; j++)
					cin >> M[k][j];
			}
		}
		
		// Конструктор скалярной матрицы с заданным элементом на главной диагонали
		TriMat(int n, int a) {
			Size = n;
			M = (int**) malloc(Size * sizeof(int));
			for (int k = 0; k < Size; k++) {
				M[k] = (int*) malloc((Size - k) * sizeof(int));
				M[k][0] = a;
			}
		}
		
		void print() {
			for (int k = 0; k < Size; k++) {
				for (int j = 0; j < k; j++)
					cout << "\t";
				for (int j = 0; j <= Size - 1 - k; j++)
					cout << M[k][j] << "\t";
				cout << endl;
			}
		}
		
    	int* operator[](size_t k) {
    		assert(0 <= k && k < Size);
    		return M[k];
    	}
		
		void assign(int i, int j, int a) {
			assert(0 <= i && i < Size && 0 <= j && j < Size);
			M[i][j] = a;
		}
		
		int el(int i, int j) {
			assert(0 <= i && i < Size && 0 <= j && j < Size);
			return M[i][j];
		}

   
		TriMat operator+ (TriMat B) {
			TriMat C(Size);
			for (int k = 0; k < Size; k++)
				for (int j = 0; j <= Size - 1 - k; j++)
					C[k][j] = M[k][j] + B[k][j];
			return C;
		}
		
		TriMat operator= (TriMat B) {
			for (int k = 0; k < Size; k++)
				for (int j = 0; j <= Size - 1 - k; j++)
				M[k][j] = B[k][j];
			return *this;
		}

		TriMat operator* (TriMat B) {
			TriMat C(Size);
			for (int k = 0; k < Size; k++)
				for (int j = k; j < Size; j++) {
					for (int r = k; r <= j; r++)
						C[k][j-k] += M[k][r-k] * B[r][j-r];
				}
			return C;
		}
};


int main() {
	int n;
	cin >> n;
	TriMat A(n), B(n), I(n,1), C = A * (I + B*B);
	A.print();
	B.print();
	C.print();
	return 0;
}