def solve():
# Считываем размеры сетки шельфа
n, m = map(int, input().split())
# Заполняем матрицу стоимостей
matrix = []
for _ in range(n):
matrix.append(list(map(int, input().split())))
ans = float('inf') # Инициализируем бесконечностью для поиска минимума
# 1. Проверяем вариант: 3 вышки в одной строке
if m >= 3:
for r in range(n):
row_sorted = sorted(matrix[r])
ans = min(ans, sum(row_sorted[:3]))
# 2. Проверяем вариант: 3 вышки в одном столбце
if n >= 3:
for c in range(m):
col_vals = [matrix[r][c] for r in range(n)]
col_sorted = sorted(col_vals)
ans = min(ans, sum(col_sorted[:3]))
# 3. Проверяем вариант: уголок (L-образная сеть)
if n >= 2 and m >= 2:
# Для каждой строки находим два минимальных элемента в формате [значение, индекс_столбца]
row_mins = []
for r in range(n):
indexed_row = sorted([[matrix[r][c], c] for c in range(m)])
row_mins.append(indexed_row[:2])
# Для каждого столбца находим два минимальных элемента в формате [значение, индекс_строки]
col_mins = []
for c in range(m):
indexed_col = sorted([[matrix[r][c], r] for r in range(n)])
col_mins.append(indexed_col[:2])
# Перебираем каждую клетку (r, c) как центральный узел сети
for r in range(n):
for c in range(m):
# Ищем лучшую соседнюю вышку в строке r (не в той же клетке c)
if row_mins[r][0][1] != c:
min_row_val = row_mins[r][0][0]
else:
min_row_val = row_mins[r][1][0]
# Ищем лучшую соседнюю вышку в столбце c (не в той же клетке r)
if col_mins[c][0][1] != r:
min_col_val = col_mins[c][0][0]
else:
min_col_val = col_mins[c][1][0]
# Считаем общую стоимость уголка
current_cost = matrix[r][c] + min_row_val + min_col_val
ans = min(ans, current_cost)
print(ans)
solve()