i, j = map(int, input().split())
# 解析覆盖矩阵
matrix = []
for _ in range(i):
matrix.append(list(map(int, input().split())))
# 初始化目标集合(需要覆盖的所有模块)
target = set(range(j))
# 贪心算法:选择覆盖最多未覆盖模块的用例
selected = []
covered = set()
flag = 1
while covered != target:
best_test_case = None
best_coverage = 0
for idx, test_case in enumerate(matrix):
# 当前用例能覆盖的未覆盖模块
current_coverage = sum(1 for k in range(j) if test_case[k] == 1 and k not in covered)
if current_coverage > best_coverage:
best_coverage = current_coverage
best_test_case = idx
# 无法继续覆盖新模块,返回 -1
if best_test_case is None:
flag = 0
# 选择当前最优用例,并更新覆盖情况
selected.append(best_test_case)
for k in range(j):
if matrix[best_test_case][k] == 1:
covered.add(k)
# 输出最小用例集合的大小
if flag == 1:
print(len(selected))
else:
print(-1)
# 4 4
# 1 0 1 0
# 0 1 0 1
# 1 1 0 0
# 0 0 1 1
2
# 3 2
# 1 0
# 0 1
# 1 1
1