import java.util.Scanner;

public class Main{
	public static void main(String[] args){

		Scanner scan = new Scanner(System.in);

		//二つの行列の行と列を宣言
		int row = scan.nextInt();
		int columnRow = scan.nextInt();
		int column = scan.nextInt();

		//二つの行列(二次元配列)を宣言
		int[][] matrixA = new int[row][columnRow];
		int[][] matrixB = new int[columnRow][column];
		long[][] matrixC = new long[row][column];

		//行列Aのためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		}

		//行列Bのためのループ
		for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		}

		//行列Cの計算のためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		}
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		}
		scan.close();
	}
}
 import java.util.Scanner; Scanner java.util public class Main{
	public static void main(String[] args){

		Scanner scan = new Scanner(System.in);

		//二つの行列の行と列を宣言
		int row = scan.nextInt();
		int columnRow = scan.nextInt();
		int column = scan.nextInt();

		//二つの行列(二次元配列)を宣言
		int[][] matrixA = new int[row][columnRow];
		int[][] matrixB = new int[columnRow][column];
		long[][] matrixC = new long[row][column];

		//行列Aのためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		}

		//行列Bのためのループ
		for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		}

		//行列Cの計算のためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		}
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		}
		scan.close();
	}
} Main public static void main(String[] args){

		Scanner scan = new Scanner(System.in);

		//二つの行列の行と列を宣言
		int row = scan.nextInt();
		int columnRow = scan.nextInt();
		int column = scan.nextInt();

		//二つの行列(二次元配列)を宣言
		int[][] matrixA = new int[row][columnRow];
		int[][] matrixB = new int[columnRow][column];
		long[][] matrixC = new long[row][column];

		//行列Aのためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		}

		//行列Bのためのループ
		for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		}

		//行列Cの計算のためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		}
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		}
		scan.close();
	} main {

		Scanner scan = new Scanner(System.in);

		//二つの行列の行と列を宣言
		int row = scan.nextInt();
		int columnRow = scan.nextInt();
		int column = scan.nextInt();

		//二つの行列(二次元配列)を宣言
		int[][] matrixA = new int[row][columnRow];
		int[][] matrixB = new int[columnRow][column];
		long[][] matrixC = new long[row][column];

		//行列Aのためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		}

		//行列Bのためのループ
		for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		}

		//行列Cの計算のためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		}
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		}
		scan.close();
	} Scanner scan = new Scanner(System.in); scan new Scanner(System.in) int row = scan.nextInt(); row scan.nextInt() scan.nextInt scan int columnRow = scan.nextInt(); columnRow scan.nextInt() scan.nextInt scan int column = scan.nextInt(); column scan.nextInt() scan.nextInt scan int[][] matrixA = new int[row][columnRow]; matrixA new int[row][columnRow] row columnRow int[][] matrixB = new int[columnRow][column]; matrixB new int[columnRow][column] columnRow column long[][] matrixC = new long[row][column]; matrixC new long[row][column] row column for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		} int rowI = 0 ; int rowI = 0 ; rowI 0 rowI < row rowI row rowI++ rowI++ rowI {
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		} {
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		} for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			} int columnRowI =0 ; int columnRowI =0 ; columnRowI 0 columnRowI < columnRow columnRowI columnRow columnRowI++ columnRowI++ columnRowI {
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			} {
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			} matrixA[rowI][columnRowI] = scan.nextInt() matrixA[rowI][columnRowI] matrixA[rowI] matrixA rowI columnRowI scan.nextInt() scan.nextInt scan for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		} int columnRowI = 0 ; int columnRowI = 0 ; columnRowI 0 columnRowI < columnRow columnRowI columnRow columnRowI++ columnRowI++ columnRowI {
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		} {
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		} for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			} int columnI =0 ; int columnI =0 ; columnI 0 columnI < column columnI column columnI++ columnI++ columnI {
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			} {
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			} matrixB[columnRowI][columnI] = scan.nextInt() matrixB[columnRowI][columnI] matrixB[columnRowI] matrixB columnRowI columnI scan.nextInt() scan.nextInt scan for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		} int rowI = 0 ; int rowI = 0 ; rowI 0 rowI < row rowI row rowI++ rowI++ rowI {
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		} {
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		} for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			} int columnRowI =0 ; int columnRowI =0 ; columnRowI 0 columnRowI < column columnRowI column columnRowI++ columnRowI++ columnRowI {
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			} {
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			} for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				} int columnI =0 ; int columnI =0 ; columnI 0 columnI < columnRow columnI columnRow columnI++ columnI++ columnI {

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				} {

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				} matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI] matrixC[rowI][columnRowI] matrixC[rowI] matrixC rowI columnRowI matrixA[rowI][columnI] * matrixB[columnI][columnRowI] matrixA[rowI][columnI] matrixA[rowI] matrixA rowI columnI matrixB[columnI][columnRowI] matrixB[columnI] matrixB columnI columnRowI for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		} int rowI = 0 ; int rowI = 0 ; rowI 0 rowI < row rowI row rowI++ rowI++ rowI {
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		} {
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		} for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			} int columnI = 0 ; int columnI = 0 ; columnI 0 columnI < column columnI column columnI++ columnI++ columnI {
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			} {
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			} if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				} columnI+ 1 == column columnI+ 1 columnI 1 column {
					System.out.println(matrixC[rowI][columnI]);
				} System.out.println(matrixC[rowI][columnI]) System.out.println System.out System System.out matrixC[rowI][columnI] matrixC[rowI] matrixC rowI columnI if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				} columnI < column columnI column {
					System.out.print(matrixC[rowI][columnI] + " ");
				} System.out.print(matrixC[rowI][columnI] + " ") System.out.print System.out System System.out matrixC[rowI][columnI] + " " matrixC[rowI][columnI] matrixC[rowI] matrixC rowI columnI " " scan.close() scan.close scan String[] args args public class Main{
	public static void main(String[] args){

		Scanner scan = new Scanner(System.in);

		//二つの行列の行と列を宣言
		int row = scan.nextInt();
		int columnRow = scan.nextInt();
		int column = scan.nextInt();

		//二つの行列(二次元配列)を宣言
		int[][] matrixA = new int[row][columnRow];
		int[][] matrixB = new int[columnRow][column];
		long[][] matrixC = new long[row][column];

		//行列Aのためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		}

		//行列Bのためのループ
		for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		}

		//行列Cの計算のためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		}
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		}
		scan.close();
	}
} public class Main{
	public static void main(String[] args){

		Scanner scan = new Scanner(System.in);

		//二つの行列の行と列を宣言
		int row = scan.nextInt();
		int columnRow = scan.nextInt();
		int column = scan.nextInt();

		//二つの行列(二次元配列)を宣言
		int[][] matrixA = new int[row][columnRow];
		int[][] matrixB = new int[columnRow][column];
		long[][] matrixC = new long[row][column];

		//行列Aのためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		}

		//行列Bのためのループ
		for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		}

		//行列Cの計算のためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		}
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		}
		scan.close();
	}
} Main
import java.util.Scanner;

public class Main{
	public static void main(String[] args){

		Scanner scan = new Scanner(System.in);

		//二つの行列の行と列を宣言
		int row = scan.nextInt();
		int columnRow = scan.nextInt();
		int column = scan.nextInt();

		//二つの行列(二次元配列)を宣言
		int[][] matrixA = new int[row][columnRow];
		int[][] matrixB = new int[columnRow][column];
		long[][] matrixC = new long[row][column];

		//行列Aのためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < columnRow ;columnRowI++){
				//行列Aの入力
				matrixA[rowI][columnRowI] = scan.nextInt();
			}
		}

		//行列Bのためのループ
		for(int columnRowI = 0 ;columnRowI < columnRow;columnRowI++){
			for(int columnI =0 ;columnI < column ;columnI++){
				//行列Bの入力
				matrixB[columnRowI][columnI] = scan.nextInt();
			}
		}

		//行列Cの計算のためのループ
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnRowI =0 ;columnRowI < column ;columnRowI++){
				for(int columnI =0 ;columnI < columnRow ;columnI++){

					//行列Cの入力
					matrixC[rowI][columnRowI]
							+= matrixA[rowI][columnI] * matrixB[columnI][columnRowI];
				}
			}
		}
		for(int rowI = 0 ;rowI < row;rowI++){
			for(int columnI = 0 ;columnI < column ;columnI++){
				if(columnI+ 1 == column){
					System.out.println(matrixC[rowI][columnI]);
				}else if(columnI < column){
					System.out.print(matrixC[rowI][columnI] + " ");
				}
			}
		}
		scan.close();
	}
}

