import java.util.*;
import java.io.*;

public class Main{
	final static int MOD = 1000000007;
	final static int INF = 1000000000;

	public static void main(String[] args) throws IOException{
		NScanner sc = new NScanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int l = sc.nextInt();
		int[][] A = new int[n][m];
		int[][] B = new int[m][l];
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		}
		for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		}
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		}
	}

}

class NScanner{

	private BufferedReader br;
	private StringTokenizer tok;

	public NScanner(InputStream is) throws IOException{
		br = new BufferedReader(new InputStreamReader(is));
		getLine();
	}

	private void getLine() throws IOException{
		while(tok == null || !hasNext()){
			tok = new StringTokenizer(br.readLine());
		}
	}

	private boolean hasNext(){
		return tok.hasMoreTokens();
	}

	public String next() throws IOException{
		if(hasNext()){
			return tok.nextToken();
		}else{
			getLine();
			return tok.nextToken();
		}
	}

	public int nextInt() throws IOException{
		if(hasNext()){
			return Integer.parseInt(tok.nextToken());
		}else{
			getLine();
			return Integer.parseInt(tok.nextToken());
		}
	}

	public long nextLong() throws IOException{
		if(hasNext()){
			return Long.parseLong(tok.nextToken());
		}else{
			getLine();
			return Long.parseLong(tok.nextToken());
		}
	}

	public double nextDouble() throws IOException{
		if(hasNext()){
			return Double.parseDouble(tok.nextToken());
		}else{
			getLine();
			return Double.parseDouble(tok.nextToken());
		}
	}
} import java.util.*; util.* java import java.io.*; io.* java public class Main{
	final static int MOD = 1000000007;
	final static int INF = 1000000000;

	public static void main(String[] args) throws IOException{
		NScanner sc = new NScanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int l = sc.nextInt();
		int[][] A = new int[n][m];
		int[][] B = new int[m][l];
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		}
		for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		}
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		}
	}

} Main final static int MOD = 1000000007; MOD 1000000007 final static int INF = 1000000000; INF 1000000000 public static void main(String[] args) throws IOException{
		NScanner sc = new NScanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int l = sc.nextInt();
		int[][] A = new int[n][m];
		int[][] B = new int[m][l];
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		}
		for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		}
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		}
	} main {
		NScanner sc = new NScanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int l = sc.nextInt();
		int[][] A = new int[n][m];
		int[][] B = new int[m][l];
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		}
		for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		}
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		}
	} NScanner sc = new NScanner(System.in); sc new NScanner(System.in) int n = sc.nextInt(); n sc.nextInt() sc.nextInt sc int m = sc.nextInt(); m sc.nextInt() sc.nextInt sc int l = sc.nextInt(); l sc.nextInt() sc.nextInt sc int[][] A = new int[n][m]; A new int[n][m] n m int[][] B = new int[m][l]; B new int[m][l] m l for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		} int i = 0; int i = 0; i 0 i < n i n ++i ++i i {
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		} {
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		} for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt(); int j = 0; int j = 0; j 0 j < m j m ++j ++j j A[i][j] = sc.nextInt(); A[i][j] = sc.nextInt() A[i][j] A[i] A i j sc.nextInt() sc.nextInt sc for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		} int i = 0; int i = 0; i 0 i < m i m ++i ++i i {
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		} {
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		} for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt(); int j = 0; int j = 0; j 0 j < l j l ++j ++j j B[i][j] = sc.nextInt(); B[i][j] = sc.nextInt() B[i][j] B[i] B i j sc.nextInt() sc.nextInt sc for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		} int i = 0; int i = 0; i 0 i < n i n ++i ++i i {
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		} {
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		} for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			} int j = 0; int j = 0; j 0 j < l j l ++j ++j j {
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			} {
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			} if(j != 0) System.out.print(" "); j != 0 j 0 System.out.print(" ") System.out.print System.out System System.out " " long c = 0; c 0 for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j]; int k = 0; int k = 0; k 0 k < m k m ++k ++k k c += A[i][k] * B[k][j]; c += A[i][k] * B[k][j] c A[i][k] * B[k][j] A[i][k] A[i] A i k B[k][j] B[k] B k j System.out.print(c) System.out.print System.out System System.out c System.out.println() System.out.println System.out System System.out String[] args args class NScanner{

	private BufferedReader br;
	private StringTokenizer tok;

	public NScanner(InputStream is) throws IOException{
		br = new BufferedReader(new InputStreamReader(is));
		getLine();
	}

	private void getLine() throws IOException{
		while(tok == null || !hasNext()){
			tok = new StringTokenizer(br.readLine());
		}
	}

	private boolean hasNext(){
		return tok.hasMoreTokens();
	}

	public String next() throws IOException{
		if(hasNext()){
			return tok.nextToken();
		}else{
			getLine();
			return tok.nextToken();
		}
	}

	public int nextInt() throws IOException{
		if(hasNext()){
			return Integer.parseInt(tok.nextToken());
		}else{
			getLine();
			return Integer.parseInt(tok.nextToken());
		}
	}

	public long nextLong() throws IOException{
		if(hasNext()){
			return Long.parseLong(tok.nextToken());
		}else{
			getLine();
			return Long.parseLong(tok.nextToken());
		}
	}

	public double nextDouble() throws IOException{
		if(hasNext()){
			return Double.parseDouble(tok.nextToken());
		}else{
			getLine();
			return Double.parseDouble(tok.nextToken());
		}
	}
} NScanner private BufferedReader br; br private StringTokenizer tok; tok public NScanner(InputStream is) throws IOException{
		br = new BufferedReader(new InputStreamReader(is));
		getLine();
	} NScanner {
		br = new BufferedReader(new InputStreamReader(is));
		getLine();
	} br = new BufferedReader(new InputStreamReader(is)) br new BufferedReader(new InputStreamReader(is)) getLine() getLine InputStream is is private void getLine() throws IOException{
		while(tok == null || !hasNext()){
			tok = new StringTokenizer(br.readLine());
		}
	} getLine {
		while(tok == null || !hasNext()){
			tok = new StringTokenizer(br.readLine());
		}
	} while(tok == null || !hasNext()){
			tok = new StringTokenizer(br.readLine());
		} tok == null || !hasNext() tok == null tok null !hasNext() hasNext() hasNext {
			tok = new StringTokenizer(br.readLine());
		} tok = new StringTokenizer(br.readLine()) tok new StringTokenizer(br.readLine()) private boolean hasNext(){
		return tok.hasMoreTokens();
	} hasNext {
		return tok.hasMoreTokens();
	} return tok.hasMoreTokens(); tok.hasMoreTokens() tok.hasMoreTokens tok public String next() throws IOException{
		if(hasNext()){
			return tok.nextToken();
		}else{
			getLine();
			return tok.nextToken();
		}
	} next {
		if(hasNext()){
			return tok.nextToken();
		}else{
			getLine();
			return tok.nextToken();
		}
	} if(hasNext()){
			return tok.nextToken();
		}else{
			getLine();
			return tok.nextToken();
		} hasNext() hasNext {
			return tok.nextToken();
		} return tok.nextToken(); tok.nextToken() tok.nextToken tok {
			getLine();
			return tok.nextToken();
		} getLine() getLine return tok.nextToken(); tok.nextToken() tok.nextToken tok public int nextInt() throws IOException{
		if(hasNext()){
			return Integer.parseInt(tok.nextToken());
		}else{
			getLine();
			return Integer.parseInt(tok.nextToken());
		}
	} nextInt {
		if(hasNext()){
			return Integer.parseInt(tok.nextToken());
		}else{
			getLine();
			return Integer.parseInt(tok.nextToken());
		}
	} if(hasNext()){
			return Integer.parseInt(tok.nextToken());
		}else{
			getLine();
			return Integer.parseInt(tok.nextToken());
		} hasNext() hasNext {
			return Integer.parseInt(tok.nextToken());
		} return Integer.parseInt(tok.nextToken()); Integer.parseInt(tok.nextToken()) Integer.parseInt Integer tok.nextToken() tok.nextToken tok {
			getLine();
			return Integer.parseInt(tok.nextToken());
		} getLine() getLine return Integer.parseInt(tok.nextToken()); Integer.parseInt(tok.nextToken()) Integer.parseInt Integer tok.nextToken() tok.nextToken tok public long nextLong() throws IOException{
		if(hasNext()){
			return Long.parseLong(tok.nextToken());
		}else{
			getLine();
			return Long.parseLong(tok.nextToken());
		}
	} nextLong {
		if(hasNext()){
			return Long.parseLong(tok.nextToken());
		}else{
			getLine();
			return Long.parseLong(tok.nextToken());
		}
	} if(hasNext()){
			return Long.parseLong(tok.nextToken());
		}else{
			getLine();
			return Long.parseLong(tok.nextToken());
		} hasNext() hasNext {
			return Long.parseLong(tok.nextToken());
		} return Long.parseLong(tok.nextToken()); Long.parseLong(tok.nextToken()) Long.parseLong Long tok.nextToken() tok.nextToken tok {
			getLine();
			return Long.parseLong(tok.nextToken());
		} getLine() getLine return Long.parseLong(tok.nextToken()); Long.parseLong(tok.nextToken()) Long.parseLong Long tok.nextToken() tok.nextToken tok public double nextDouble() throws IOException{
		if(hasNext()){
			return Double.parseDouble(tok.nextToken());
		}else{
			getLine();
			return Double.parseDouble(tok.nextToken());
		}
	} nextDouble {
		if(hasNext()){
			return Double.parseDouble(tok.nextToken());
		}else{
			getLine();
			return Double.parseDouble(tok.nextToken());
		}
	} if(hasNext()){
			return Double.parseDouble(tok.nextToken());
		}else{
			getLine();
			return Double.parseDouble(tok.nextToken());
		} hasNext() hasNext {
			return Double.parseDouble(tok.nextToken());
		} return Double.parseDouble(tok.nextToken()); Double.parseDouble(tok.nextToken()) Double.parseDouble Double tok.nextToken() tok.nextToken tok {
			getLine();
			return Double.parseDouble(tok.nextToken());
		} getLine() getLine return Double.parseDouble(tok.nextToken()); Double.parseDouble(tok.nextToken()) Double.parseDouble Double tok.nextToken() tok.nextToken tok public class Main{
	final static int MOD = 1000000007;
	final static int INF = 1000000000;

	public static void main(String[] args) throws IOException{
		NScanner sc = new NScanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int l = sc.nextInt();
		int[][] A = new int[n][m];
		int[][] B = new int[m][l];
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		}
		for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		}
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		}
	}

} public class Main{
	final static int MOD = 1000000007;
	final static int INF = 1000000000;

	public static void main(String[] args) throws IOException{
		NScanner sc = new NScanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int l = sc.nextInt();
		int[][] A = new int[n][m];
		int[][] B = new int[m][l];
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		}
		for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		}
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		}
	}

} Main
import java.util.*;
import java.io.*;

public class Main{
	final static int MOD = 1000000007;
	final static int INF = 1000000000;

	public static void main(String[] args) throws IOException{
		NScanner sc = new NScanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int l = sc.nextInt();
		int[][] A = new int[n][m];
		int[][] B = new int[m][l];
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < m; ++j)
				A[i][j] = sc.nextInt();
		}
		for(int i = 0; i < m; ++i){
			for(int j = 0; j < l; ++j)
				B[i][j] = sc.nextInt();
		}
		for(int i = 0; i < n; ++i){
			for(int j = 0; j < l; ++j){
				if(j != 0) System.out.print(" ");
				long c = 0;
				for(int k = 0; k < m; ++k)
					c += A[i][k] * B[k][j];
				System.out.print(c);
			}
			System.out.println();
		}
	}

}

class NScanner{

	private BufferedReader br;
	private StringTokenizer tok;

	public NScanner(InputStream is) throws IOException{
		br = new BufferedReader(new InputStreamReader(is));
		getLine();
	}

	private void getLine() throws IOException{
		while(tok == null || !hasNext()){
			tok = new StringTokenizer(br.readLine());
		}
	}

	private boolean hasNext(){
		return tok.hasMoreTokens();
	}

	public String next() throws IOException{
		if(hasNext()){
			return tok.nextToken();
		}else{
			getLine();
			return tok.nextToken();
		}
	}

	public int nextInt() throws IOException{
		if(hasNext()){
			return Integer.parseInt(tok.nextToken());
		}else{
			getLine();
			return Integer.parseInt(tok.nextToken());
		}
	}

	public long nextLong() throws IOException{
		if(hasNext()){
			return Long.parseLong(tok.nextToken());
		}else{
			getLine();
			return Long.parseLong(tok.nextToken());
		}
	}

	public double nextDouble() throws IOException{
		if(hasNext()){
			return Double.parseDouble(tok.nextToken());
		}else{
			getLine();
			return Double.parseDouble(tok.nextToken());
		}
	}
}
