
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args){
		BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));
		try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		}
	}

}
 import java.io.BufferedReader; BufferedReader java.io import java.io.IOException; IOException java.io import java.io.InputStreamReader; InputStreamReader java.io public class Main {
	public static void main(String[] args){
		BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));
		try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		}
	}

} Main public static void main(String[] args){
		BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));
		try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		}
	} main {
		BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));
		try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		}
	} BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in)); insBR new BufferedReader(new InputStreamReader(System.in)) try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		} catch(IOException e){
			e.printStackTrace();
		} IOException e {
			e.printStackTrace();
		} e.printStackTrace() e.printStackTrace e catch(NumberFormatException e){
			e.printStackTrace();
		} NumberFormatException e {
			e.printStackTrace();
		} e.printStackTrace() e.printStackTrace e {

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		} String[] strLine = insBR.readLine().split(" "); strLine insBR.readLine().split(" ") insBR.readLine().split insBR.readLine() insBR.readLine insBR " " int[] intLine = new int[strLine.length]; intLine new int[strLine.length] strLine.length strLine strLine.length for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			} int i = 0; int i = 0; i 0 i < strLine.length i strLine.length strLine strLine.length i++ i++ i {
				intLine[i] = Integer.parseInt(strLine[i]);
			} {
				intLine[i] = Integer.parseInt(strLine[i]);
			} intLine[i] = Integer.parseInt(strLine[i]) intLine[i] intLine i Integer.parseInt(strLine[i]) Integer.parseInt Integer strLine[i] strLine i int intN = intLine[0]; intN intLine[0] intLine 0 int intM = intLine[1]; intM intLine[1] intLine 1 int intL = intLine[2]; intL intLine[2] intLine 2 int[][] intA = new int[intN][intM]; intA new int[intN][intM] intN intM for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			} int i = 0; int i = 0; i 0 i < intN i intN i++ i++ i {
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			} {
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			} strLine = insBR.readLine().split(" ") strLine insBR.readLine().split(" ") insBR.readLine().split insBR.readLine() insBR.readLine insBR " " for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				} int j = 0; int j = 0; j 0 j < intM j intM j++ j++ j {
					intA[i][j] = Integer.parseInt(strLine[j]);
				} {
					intA[i][j] = Integer.parseInt(strLine[j]);
				} intA[i][j] = Integer.parseInt(strLine[j]) intA[i][j] intA[i] intA i j Integer.parseInt(strLine[j]) Integer.parseInt Integer strLine[j] strLine j int[][] intB = new int[intM][intL]; intB new int[intM][intL] intM intL for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			} int i = 0; int i = 0; i 0 i < intM i intM i++ i++ i {
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			} {
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			} strLine = insBR.readLine().split(" ") strLine insBR.readLine().split(" ") insBR.readLine().split insBR.readLine() insBR.readLine insBR " " for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				} int j = 0; int j = 0; j 0 j < intL j intL j++ j++ j {
					intB[i][j] = Integer.parseInt(strLine[j]);
				} {
					intB[i][j] = Integer.parseInt(strLine[j]);
				} intB[i][j] = Integer.parseInt(strLine[j]) intB[i][j] intB[i] intB i j Integer.parseInt(strLine[j]) Integer.parseInt Integer strLine[j] strLine j long[][] longC = new long[intN][intL]; longC new long[intN][intL] intN intL for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			} int i = 0; int i = 0; i 0 i < intN i intN i++ i++ i {
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			} {
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			} for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				} int j = 0; int j = 0; j 0 j < intL j intL j++ j++ j {
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				} {
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				} for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					} int k = 0; int k = 0; k 0 k < intM k intM k++ k++ k {
						longC[i][j] += intA[i][k] * intB[k][j];
					} {
						longC[i][j] += intA[i][k] * intB[k][j];
					} longC[i][j] += intA[i][k] * intB[k][j] longC[i][j] longC[i] longC i j intA[i][k] * intB[k][j] intA[i][k] intA[i] intA i k intB[k][j] intB[k] intB k j for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			} int i = 0; int i = 0; i 0 i < intN i intN i++ i++ i {
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			} {
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			} for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				} int j = 0; int j = 0; j 0 j < intL j intL j++ j++ j {
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				} {
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				} if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					} j != intL - 1 j intL - 1 intL 1 {
						System.out.print(longC[i][j] + " ");
					} System.out.print(longC[i][j] + " ") System.out.print System.out System System.out longC[i][j] + " " longC[i][j] longC[i] longC i j " " {
						System.out.println(longC[i][j]);
					} System.out.println(longC[i][j]) System.out.println System.out System System.out longC[i][j] longC[i] longC i j String[] args args public class Main {
	public static void main(String[] args){
		BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));
		try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		}
	}

} public class Main {
	public static void main(String[] args){
		BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));
		try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		}
	}

} Main

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args){
		BufferedReader insBR = new BufferedReader(new InputStreamReader(System.in));
		try{

			//最初の行の数値を読み取る。
			String[] strLine = insBR.readLine().split(" ");
			int[] intLine = new int[strLine.length];
			for(int i = 0; i < strLine.length; i++){
				intLine[i] = Integer.parseInt(strLine[i]);
			}
			int intN = intLine[0];
			int intM = intLine[1];
			int intL = intLine[2];

			//n×m の行列 A
			int[][] intA = new int[intN][intM];
			for(int i = 0; i < intN; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intM; j++){
					intA[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//m×l の行列 B
			int[][] intB = new int[intM][intL];
			for(int i = 0; i < intM; i++){
				strLine = insBR.readLine().split(" ");
				for(int j = 0; j < intL; j++){
					intB[i][j] = Integer.parseInt(strLine[j]);
				}
			}

			//n×l の行列 C
			long[][] longC = new long[intN][intL];
			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					for(int k = 0; k < intM; k++){
						longC[i][j] += intA[i][k] * intB[k][j];
					}
				}
			}

			for(int i = 0; i < intN; i++){
				for(int j = 0; j < intL; j++){
					if(j != intL - 1){
						System.out.print(longC[i][j] + " ");
					}else{
						System.out.println(longC[i][j]);
					}
				}
			}




		}catch(IOException e){
			e.printStackTrace();
		}catch(NumberFormatException e){
			e.printStackTrace();
		}
	}

}

