# 读取输入
n, m, q = map(int, input().split())
# 存储草地初始状态
grass = [input() for _ in range(n)]
# 存储所有烟花燃放计划
plans = []
for _ in range(q):
    plan = [input() for _ in range(n)]
    plans.append(plan)

# 初始化最小计划数量为一个较大值
min_count = float("inf")
min_combination = None

# 遍历所有可能的计划组合
for mask in range(1 << q):
    combined_plan = [["0"] * m for _ in range(n)]
    selected_plans = []
    # 确定当前组合中选择了哪些计划
    for i in range(q):
        if mask & (1 << i):
            selected_plans.append(i + 1)
            for x in range(n):
                for y in range(m):
                    if plans[i][x][y] == "1":
                        combined_plan[x][y] = "1"

    valid = True
    for x in range(n):
        for y in range(m):
            if grass[x][y] == "1" and combined_plan[x][y] == "1":
                valid = False
                break
            if grass[x][y] == "0" and combined_plan[x][y] == "0":
                valid = False
                break
        if not valid:
            break

    if valid and len(selected_plans) < min_count:
        min_count = len(selected_plans)
        min_combination = selected_plans

if min_combination is None:
    print(-1)
else:
    print(min_count)
    print(*min_combination)