import sys
# Увеличиваем лимит рекурсии на всякий случай, тут не нужно, но хорошая практика для олимпиад
sys.setrecursionlimit(2000)
def solve():
# Читаем n и m
input_data = sys.stdin.read().split()
if not input_data:
return
iterator = iter(input_data)
n = int(next(iterator))
m = int(next(iterator))
# Считываем матрицу стоимостей
a = []
for _ in range(n):
row = [int(next(iterator)) for _ in range(m)]
a.append(row)
MOD = 1000000103
INF = float('inf')
# Для каждой строки храним два наименьших значения и их индексы колонок
# row_min1[i] = (значение, индекс_колонки)
row_min1 = [(INF, -1)] * n
row_min2 = [(INF, -1)] * n
for i in range(n):
for j in range(m):
val = a[i][j]
if val < row_min1[i][0]:
row_min2[i] = row_min1[i]
row_min1[i] = (val, j)
elif val < row_min2[i][0]:
row_min2[i] = (val, j)
# Для каждого столбца храним два наименьших значения и их индексы строк
col_min1 = [(INF, -1)] * m
col_min2 = [(INF, -1)] * m
for j in range(m):
for i in range(n):
val = a[i][j]
if val < col_min1[j][0]:
col_min2[j] = col_min1[j]
col_min1[j] = (val, i)
elif val < col_min2[j][0]:
col_min2[j] = (val, i)
best_total = INF
# Перебираем каждую клетку как центральную вышку №2
for i in range(n):
for j in range(m):
# Находим минимальную стоимость в строке i, исключая колонку j
if row_min1[i][1] != j:
min_row_val = row_min1[i][0]
else:
min_row_val = row_min2[i][0]
# Находим минимальную стоимость в столбце j, исключая строку i
if col_min1[j][1] != i:
min_col_val = col_min1[j][0]
else:
min_col_val = col_min2[j][0]
# Если не нашлось подходящей клетки в строке или столбце — пропускаем
if min_row_val == INF or min_col_val == INF:
continue
current_total = a[i][j] + min_row_val + min_col_val
if current_total < best_total:
best_total = current_total
print(best_total % MOD)
if __name__ == "__main__":
solve()