import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// intN,intM,intLを入力
		int intN = scanner.nextInt();
		int intM = scanner.nextInt();
		int intL = scanner.nextInt();

		long[][] longA = new long[intN][intM];
		for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		}

		long[][] longB = new long[intM][intL];
		for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		}
		//long[][] longC = new long[intN][intL];
		long longC = 0;
		for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		}

	}
}
 import java.util.Scanner; Scanner java.util public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// intN,intM,intLを入力
		int intN = scanner.nextInt();
		int intM = scanner.nextInt();
		int intL = scanner.nextInt();

		long[][] longA = new long[intN][intM];
		for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		}

		long[][] longB = new long[intM][intL];
		for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		}
		//long[][] longC = new long[intN][intL];
		long longC = 0;
		for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		}

	}
} Main public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// intN,intM,intLを入力
		int intN = scanner.nextInt();
		int intM = scanner.nextInt();
		int intL = scanner.nextInt();

		long[][] longA = new long[intN][intM];
		for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		}

		long[][] longB = new long[intM][intL];
		for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		}
		//long[][] longC = new long[intN][intL];
		long longC = 0;
		for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		}

	} main {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// intN,intM,intLを入力
		int intN = scanner.nextInt();
		int intM = scanner.nextInt();
		int intL = scanner.nextInt();

		long[][] longA = new long[intN][intM];
		for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		}

		long[][] longB = new long[intM][intL];
		for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		}
		//long[][] longC = new long[intN][intL];
		long longC = 0;
		for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		}

	} Scanner scanner = new Scanner(System.in); scanner new Scanner(System.in) int intN = scanner.nextInt(); intN scanner.nextInt() scanner.nextInt scanner int intM = scanner.nextInt(); intM scanner.nextInt() scanner.nextInt scanner int intL = scanner.nextInt(); intL scanner.nextInt() scanner.nextInt scanner long[][] longA = new long[intN][intM]; longA new long[intN][intM] intN intM for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		} int intI = 0; int intI = 0; intI 0 intI < intN intI intN intI++ intI++ intI {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		} {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		} for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			} int intJ = 0; int intJ = 0; intJ 0 intJ < intM intJ intM intJ++ intJ++ intJ {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			} {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			} longA[intI][intJ] = scanner.nextInt() longA[intI][intJ] longA[intI] longA intI intJ scanner.nextInt() scanner.nextInt scanner long[][] longB = new long[intM][intL]; longB new long[intM][intL] intM intL for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		} int intO = 0; int intO = 0; intO 0 intO < intM intO intM intO++ intO++ intO {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		} {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		} for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			} int intP = 0; int intP = 0; intP 0 intP < intL intP intL intP++ intP++ intP {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			} {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			} longB[intO][intP] = scanner.nextInt() longB[intO][intP] longB[intO] longB intO intP scanner.nextInt() scanner.nextInt scanner long longC = 0; longC 0 for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		} int intX = 0; int intX = 0; intX 0 intX < intN intX intN intX++ intX++ intX {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		} {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		} for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			} int intY = 0; int intY = 0; intY 0 intY < intL intY intL intY++ intY++ intY {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			} {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			} for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				} int intZ = 0; int intZ = 0; intZ 0 intZ < intM intZ intM intZ++ intZ++ intZ {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				} {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				} longC += longA[intX][intZ] * longB[intZ][intY] longC longA[intX][intZ] * longB[intZ][intY] longA[intX][intZ] longA[intX] longA intX intZ longB[intZ][intY] longB[intZ] longB intZ intY if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						} intZ == intM -1 intZ intM -1 intM 1 {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						} if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							} !(intY == intL -1) (intY == intL -1) intY intL -1 intL 1 {
								System.out.print(longC + " ");
								longC = 0;
							} System.out.print(longC + " ") System.out.print System.out System System.out longC + " " longC " " longC = 0 longC 0 if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							} intY == intL - 1 intY intL - 1 intL 1 {
								System.out.println(longC);
								longC = 0;
							} System.out.println(longC) System.out.println System.out System System.out longC longC = 0 longC 0 String[] args args public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// intN,intM,intLを入力
		int intN = scanner.nextInt();
		int intM = scanner.nextInt();
		int intL = scanner.nextInt();

		long[][] longA = new long[intN][intM];
		for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		}

		long[][] longB = new long[intM][intL];
		for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		}
		//long[][] longC = new long[intN][intL];
		long longC = 0;
		for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		}

	}
} public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// intN,intM,intLを入力
		int intN = scanner.nextInt();
		int intM = scanner.nextInt();
		int intL = scanner.nextInt();

		long[][] longA = new long[intN][intM];
		for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		}

		long[][] longB = new long[intM][intL];
		for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		}
		//long[][] longC = new long[intN][intL];
		long longC = 0;
		for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		}

	}
} Main
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		// intN,intM,intLを入力
		int intN = scanner.nextInt();
		int intM = scanner.nextInt();
		int intL = scanner.nextInt();

		long[][] longA = new long[intN][intM];
		for (int intI = 0; intI < intN; intI++) {
			for (int intJ = 0; intJ < intM; intJ++) {
				// 配列longAに数値を入力する
				longA[intI][intJ] = scanner.nextInt();
			}
		}

		long[][] longB = new long[intM][intL];
		for (int intO = 0; intO < intM; intO++) {
			for (int intP = 0; intP < intL; intP++) {
				// 配列longBに数値を入力する
				longB[intO][intP] = scanner.nextInt();
			}
		}
		//long[][] longC = new long[intN][intL];
		long longC = 0;
		for (int intX = 0; intX < intN; intX++) {
			for (int intY = 0; intY < intL; intY++) {
				for (int intZ = 0; intZ < intM; intZ++) {
					longC += longA[intX][intZ] * longB[intZ][intY];
						if (intZ == intM -1) {
							if (!(intY == intL -1)) {
								System.out.print(longC + " ");
								longC = 0;
							} else if (intY == intL - 1) {
								System.out.println(longC);
								longC = 0;
							}
						}
				}
			}
		}

	}
}

