#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <tuple>
#include <cstring>
using namespace std;
int map[201][201];
int dis[201][201][31];
int dx[12] = { 1,-1,0,0,-2,-2,-1,-1,1,1,2,2 };
int dy[12] = { 0,0,1,-1,-1,1,-2,2,-2,2,-1,1 };
int d[12] = { 0,0,0,0,1,1,1,1,1,1,1,1 };
int main() {
//freopen("in1.txt", "rt", stdin);
int x, y, c;
int n, m;
int key;
cin >> key;
cin >> m >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> map[i][j];
}
}
queue<tuple<int, int, int>> Q;
Q.push(make_tuple(1, 1, 0));
memset(dis, -1, sizeof(dis));
dis[1][1][0] = 0;
while (!Q.empty()) {
tie(x, y, c) = Q.front();
Q.pop();
for (int i = 0; i < 12; i++) {
int xx = x + dx[i];
int yy = y + dy[i];
int cc = c + d[i];
if (xx > n || xx <= 0 || yy > m || yy <= 0) continue;
if (map[xx][yy] == 1) continue;
//if (cc > key) continue;
if (dis[xx][yy][cc] == -1 && cc <= key) {
dis[xx][yy][cc] = dis[x][y][c] + 1;
Q.push(make_tuple(xx, yy, cc));
}
}
}
int ans = -1;
for (int i = 0; i <= key; i++) {
if (dis[n][m][i] == -1) continue;
if (ans==-1||dis[n][m][i] < ans) ans = dis[n][m][i];
}
cout << ans << '\n';
return 0;
}