N = gets.to_i M = gets.to_i A = M.times.map { gets.split.map(&:to_i) } step_cost = Array.new(34) { Array.new(M) { Array.new(M, 0) } } M.times do |i| M.times do |j| step_cost[0][i][j] = A[i][j] end end 33.times do |i| M.times do |from| M.times do |to| M.times do |mid| ncost = step_cost[i][from][mid] + step_cost[i][mid][to] if step_cost[i + 1][from][to] < ncost step_cost[i + 1][from][to] = ncost end end end end end step_cnt = N - 1 ans = 0 dp = Array.new(34) { Array.new(M) { Array.new(M, 0) } } 33.times do |i| if step_cnt[i] == 1 M.times do |from| M.times do |to| M.times do |mid| cost = dp[i][from][mid] + step_cost[i][mid][to] if dp[i + 1][from][to] < cost dp[i + 1][from][to] = cost end ans = cost if ans < cost end end end else M.times do |from| M.times do |to| dp[i + 1][from][to] = dp[i][from][to] end end end end puts ans