import sys;sys.setrecursionlimit(1000000) def MI():return map(int,input().split()) def PRINT(ans): from collections.abc import Sequence if isinstance(ans,bool): s='Yes' if ans else 'No' elif isinstance(ans,Sequence) and not isinstance(ans,str): s='\n'.join(map(str,ans)) else: s=str(ans) sys.stdout.write(s+'\n') INF=10**18 mod=998244353 D4=[(1,0),(-1,0),(0,1),(0,-1)] D8=D4+[(1,1),(-1,1),(1,-1),(-1,-1)] #from math import gcd,lcm,log2,sqrt,isqrt #from collections import deque,defaultdict #from heapq import heappop,heappush,heapify #from bisect import bisect_left,bisect_right #from itertools import permutations,combinations,combinations_with_replacement,product #from functools import lru_cache #from atcoder.dsu import DSU #from atcoder.math import inv_mod #from atcoder.segtree import Segtree #from atcoder.fenwicktree import FenwickTree #from atcoder.string import z_algorythm ## main def multiple(A,B): ha=len(A) hb=len(B) wa=len(A[0]) wb=len(B[0]) assert wa==hb AB=[[0]*wb for _ in range(ha)] for i in range(ha): for j in range(wb): for k in range(wa): AB[i][j]+=A[i][k]*B[k][j] return AB M=[list(MI()) for i in range(2)] N=[list(MI()) for i in range(2)] a=multiple(M,N) b=multiple(N,a) c=multiple(M,b) for i in range(2): print(*c[i])