def solve(N, F, A, B, C): size = (F * N) // 64 + 1 # masks[i] は i ビット分 1 が立っているマスク masks = [(1 << i) - 1 for i in range(65)] # dp 初期化 dp = [0] * size nextdp = [0] * size # 初期位置の設定 (63 - A[0]の位置を立てる) dp[0] |= 1 << (63 - A[0]) dp[0] |= 1 << (63 - B[0]) dp[0] |= 1 << (63 - C[0]) # 最初のpopcount print(bin(dp[0]).count('1')) for k in range(1, N): a, b, c = A[k], B[k], C[k] # A[i] による遷移 nextdp[0] = dp[0] >> a for i in range(1, size): nextdp[i] = (dp[i] >> a) | ((dp[i-1] & masks[a]) << (64 - a)) # B[i] による遷移 nextdp[0] |= dp[0] >> b for i in range(1, size): nextdp[i] |= (dp[i] >> b) | ((dp[i-1] & masks[b]) << (64 - b)) # C[i] による遷移 nextdp[0] |= dp[0] >> c for i in range(1, size): nextdp[i] |= (dp[i] >> c) | ((dp[i-1] & masks[c]) << (64 - c)) # popcount ans = sum(bin(x).count('1') for x in nextdp) print(ans) # dpを更新 dp, nextdp = nextdp, [0] * size LMI=lambda:list(map(int, input().split())) LMS=lambda:list(map(str, input().split())) MI=lambda:map(int, input().split()) MS=lambda:map(str, input().split()) II=lambda:int(input()) IS=lambda:input().split() LI=lambda:list(input()) N,F=MI() A=LMI() B=LMI() C=LMI() solve(N, F, A, B, C)