#include using namespace std; long long solve(long long n, int m, const vector> & A){ vector>> dp(m, vector>(m + 1, vector(m, 0))); for (int s = 0; s < m; ++s){ for (int d = 1; d < m + 1; ++d){ for (int g = 0; g < m; ++g){ if (d == 1){ dp[s][d][g] = A[s][g]; continue; }; for (int v = 0; v < m; ++v){ dp[s][d][g] = max(dp[s][d][g], dp[s][d - 1][v] + A[v][g]); } } } } vector> tail(m, vector(m + 1, 0)); for (int s = 0; s < m; ++s){ for (int d = 1; d < m + 1; ++d){ tail[s][d] = *max_element(begin(dp[s][d]), end(dp[s][d])); } } --n; long long record = 0; for (int s = 0; s < m; ++s){ for (int d1 = 0; d1 < m and n - d1 >= 0; ++d1){ for (int v = 0; v < m; ++v){ for (int d2 = 1; d2 < m + 1; ++d2){ long long cycle = (n - d1)/(long long)d2; auto d3 = n - d1 - cycle * d2; long long score = dp[s][d1][v] + dp[v][d2][v] * cycle + tail[v][d3]; if (score > record) record = score; } } } } return record; } int main() { long long n; cin >> n; int m; cin >> m; vector> A(m, vector(m, 0)); for (auto & row : A){ for (auto & v : row) cin >> v; } cout << solve(n, m, A) << endl; return 0; }