import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
    static int n;
    static int m;
    static int l;
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        l = sc.nextInt();
        long[][] vec1 = new long[n][m];
        long[][] vec2 = new long[m][l];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        }
        long[][] ans = vecMul(vec1,vec2);
        prlong(ans);
    }
    static void prlong(long[][] ans) {
        for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        }
    }
    static long[][] vecMul(long[][] vec1,long[][] vec2) {
        long[][] ans = new long[n][l];
        long sum=0;
        //かける回数はn*lの要素数に等しい
        for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        }
        return ans;
    }
} import java.io.BufferedReader; BufferedReader java.io import java.io.InputStreamReader; InputStreamReader java.io import java.util.*; util.* java public class Main {
    static int n;
    static int m;
    static int l;
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        l = sc.nextInt();
        long[][] vec1 = new long[n][m];
        long[][] vec2 = new long[m][l];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        }
        long[][] ans = vecMul(vec1,vec2);
        prlong(ans);
    }
    static void prlong(long[][] ans) {
        for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        }
    }
    static long[][] vecMul(long[][] vec1,long[][] vec2) {
        long[][] ans = new long[n][l];
        long sum=0;
        //かける回数はn*lの要素数に等しい
        for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        }
        return ans;
    }
} Main static int n; n static int m; m static int l; l public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        l = sc.nextInt();
        long[][] vec1 = new long[n][m];
        long[][] vec2 = new long[m][l];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        }
        long[][] ans = vecMul(vec1,vec2);
        prlong(ans);
    } main {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        l = sc.nextInt();
        long[][] vec1 = new long[n][m];
        long[][] vec2 = new long[m][l];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        }
        long[][] ans = vecMul(vec1,vec2);
        prlong(ans);
    } Scanner sc = new Scanner(System.in); sc new Scanner(System.in) n = sc.nextInt() n sc.nextInt() sc.nextInt sc m = sc.nextInt() m sc.nextInt() sc.nextInt sc l = sc.nextInt() l sc.nextInt() sc.nextInt sc long[][] vec1 = new long[n][m]; vec1 new long[n][m] n m long[][] vec2 = new long[m][l]; vec2 new long[m][l] m l for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[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++){
                vec1[i][j]=sc.nextInt();
            }
        } {
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        } for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            } int j=0; int j=0; j 0 j<m j m j++ j++ j {
                vec1[i][j]=sc.nextInt();
            } {
                vec1[i][j]=sc.nextInt();
            } vec1[i][j]=sc.nextInt() vec1[i][j] vec1[i] vec1 i j sc.nextInt() sc.nextInt sc for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[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++){
                vec2[i][j]=sc.nextInt();
            }
        } {
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        } for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            } int j=0; int j=0; j 0 j<l j l j++ j++ j {
                vec2[i][j]=sc.nextInt();
            } {
                vec2[i][j]=sc.nextInt();
            } vec2[i][j]=sc.nextInt() vec2[i][j] vec2[i] vec2 i j sc.nextInt() sc.nextInt sc long[][] ans = vecMul(vec1,vec2); ans vecMul(vec1,vec2) vecMul vec1 vec2 prlong(ans) prlong ans String[] args args static void prlong(long[][] ans) {
        for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        }
    } prlong {
        for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        }
    } for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        } int i=0; int i=0; i 0 i<ans.length i ans.length ans ans.length i++ i++ i {
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        } {
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        } for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            } int j=0; int j=0; j 0 j<ans[i].length j ans[i].length ans[i] ans i ans[i].length j++ j++ j {
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            } {
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            } System.out.print(ans[i][j]) System.out.print System.out System System.out ans[i][j] ans[i] ans i j if(j!=ans[i].length-1)
                System.out.print(" "); j!=ans[i].length-1 j ans[i].length-1 ans[i].length ans[i] ans i ans[i].length 1 System.out.print(" ") System.out.print System.out System System.out " " System.out.println() System.out.println System.out System System.out long[][] ans ans static long[][] vecMul(long[][] vec1,long[][] vec2) {
        long[][] ans = new long[n][l];
        long sum=0;
        //かける回数はn*lの要素数に等しい
        for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        }
        return ans;
    } vecMul {
        long[][] ans = new long[n][l];
        long sum=0;
        //かける回数はn*lの要素数に等しい
        for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        }
        return ans;
    } long[][] ans = new long[n][l]; ans new long[n][l] n l long sum=0; sum 0 for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        } int i=0; int i=0; i 0 i<n i n i++ i++ i {
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        } {
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        } for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            } int j=0; int j=0; j 0 j<l j l j++ j++ j {
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            } {
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            } for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                } int k=0; int k=0; k 0 k<vec2.length k vec2.length vec2 vec2.length k++ k++ k {
                    sum += vec1[i][k] * vec2[k][j];
                } {
                    sum += vec1[i][k] * vec2[k][j];
                } sum += vec1[i][k] * vec2[k][j] sum vec1[i][k] * vec2[k][j] vec1[i][k] vec1[i] vec1 i k vec2[k][j] vec2[k] vec2 k j ans[i][j] = sum ans[i][j] ans[i] ans i j sum sum=0 sum 0 return ans; ans long[][] vec1 vec1 long[][] vec2 vec2 public class Main {
    static int n;
    static int m;
    static int l;
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        l = sc.nextInt();
        long[][] vec1 = new long[n][m];
        long[][] vec2 = new long[m][l];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        }
        long[][] ans = vecMul(vec1,vec2);
        prlong(ans);
    }
    static void prlong(long[][] ans) {
        for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        }
    }
    static long[][] vecMul(long[][] vec1,long[][] vec2) {
        long[][] ans = new long[n][l];
        long sum=0;
        //かける回数はn*lの要素数に等しい
        for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        }
        return ans;
    }
} public class Main {
    static int n;
    static int m;
    static int l;
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        l = sc.nextInt();
        long[][] vec1 = new long[n][m];
        long[][] vec2 = new long[m][l];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        }
        long[][] ans = vecMul(vec1,vec2);
        prlong(ans);
    }
    static void prlong(long[][] ans) {
        for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        }
    }
    static long[][] vecMul(long[][] vec1,long[][] vec2) {
        long[][] ans = new long[n][l];
        long sum=0;
        //かける回数はn*lの要素数に等しい
        for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        }
        return ans;
    }
} Main
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
    static int n;
    static int m;
    static int l;
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        l = sc.nextInt();
        long[][] vec1 = new long[n][m];
        long[][] vec2 = new long[m][l];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                vec1[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<l;j++){
                vec2[i][j]=sc.nextInt();
            }
        }
        long[][] ans = vecMul(vec1,vec2);
        prlong(ans);
    }
    static void prlong(long[][] ans) {
        for(int i=0;i<ans.length;i++){
            for(int j=0;j<ans[i].length;j++){
                System.out.print(ans[i][j]);
                if(j!=ans[i].length-1)
                System.out.print(" ");
            }
            System.out.println();
        }
    }
    static long[][] vecMul(long[][] vec1,long[][] vec2) {
        long[][] ans = new long[n][l];
        long sum=0;
        //かける回数はn*lの要素数に等しい
        for(int i=0;i<n;i++){
            //完成する列 l までかける,これで出力の1行が完成する
            for(int j=0;j<l;j++){
                //vec2の行をかける
                for(int k=0;k<vec2.length;k++) {
                    sum += vec1[i][k] * vec2[k][j];
                }
                ans[i][j] = sum;
                sum=0;
            }
        }
        return ans;
    }
}