#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate the minimum time required to infect all healthy cells
int minTime(vector<vector<int>> ar) {
    int n = ar.size();
    int m = ar[0].size();
 
    queue<pair<int, int>> q;
    int healthy = 0;      // count of healthy cells
    int time = 0;
 
    // Initialize queue with all infected cells
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (ar[i][j] == 2) q.push({i, j});
            else if (ar[i][j] == 1) healthy++;
        }
    }
 
    // Directions: up, down, left, right
    int dx[] = {-1, 1, 0, 0};
    int dy[] = {0, 0, -1, 1};
 
    // BFS traversal
    while (!q.empty() && healthy > 0) {
        int size = q.size();
        while (size--) {
            auto [x, y] = q.front();
            q.pop();
 
            for (int d = 0; d < 4; d++) {
                int nx = x + dx[d];
                int ny = y + dy[d];
 
                if (nx >= 0 && ny >= 0 && nx < n && ny < m && ar[nx][ny] == 1) {
                    ar[nx][ny] = 2; // infect the healthy cell
                    healthy--;
                    q.push({nx, ny});
                }
            }
        }
        time++; // one second passes after processing each level
    }
 
    // If some healthy cells are still left, return -1
    return (healthy == 0) ? time : -1;
}
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int N, M;
    cin >> N >> M;
    vector<vector<int>> grid(N, vector<int>(M));
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> grid[i][j];
        }
    }
 
    cout << minTime(grid) << "\n";
    return 0;
}
 
				I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG1pbmltdW0gdGltZSByZXF1aXJlZCB0byBpbmZlY3QgYWxsIGhlYWx0aHkgY2VsbHMKaW50IG1pblRpbWUodmVjdG9yPHZlY3RvcjxpbnQ+PiBhcikgewogICAgaW50IG4gPSBhci5zaXplKCk7CiAgICBpbnQgbSA9IGFyWzBdLnNpemUoKTsKCiAgICBxdWV1ZTxwYWlyPGludCwgaW50Pj4gcTsKICAgIGludCBoZWFsdGh5ID0gMDsgICAgICAvLyBjb3VudCBvZiBoZWFsdGh5IGNlbGxzCiAgICBpbnQgdGltZSA9IDA7CgogICAgLy8gSW5pdGlhbGl6ZSBxdWV1ZSB3aXRoIGFsbCBpbmZlY3RlZCBjZWxscwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG07IGorKykgewogICAgICAgICAgICBpZiAoYXJbaV1bal0gPT0gMikgcS5wdXNoKHtpLCBqfSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGFyW2ldW2pdID09IDEpIGhlYWx0aHkrKzsKICAgICAgICB9CiAgICB9CgogICAgLy8gRGlyZWN0aW9uczogdXAsIGRvd24sIGxlZnQsIHJpZ2h0CiAgICBpbnQgZHhbXSA9IHstMSwgMSwgMCwgMH07CiAgICBpbnQgZHlbXSA9IHswLCAwLCAtMSwgMX07CgogICAgLy8gQkZTIHRyYXZlcnNhbAogICAgd2hpbGUgKCFxLmVtcHR5KCkgJiYgaGVhbHRoeSA+IDApIHsKICAgICAgICBpbnQgc2l6ZSA9IHEuc2l6ZSgpOwogICAgICAgIHdoaWxlIChzaXplLS0pIHsKICAgICAgICAgICAgYXV0byBbeCwgeV0gPSBxLmZyb250KCk7CiAgICAgICAgICAgIHEucG9wKCk7CgogICAgICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8IDQ7IGQrKykgewogICAgICAgICAgICAgICAgaW50IG54ID0geCArIGR4W2RdOwogICAgICAgICAgICAgICAgaW50IG55ID0geSArIGR5W2RdOwoKICAgICAgICAgICAgICAgIGlmIChueCA+PSAwICYmIG55ID49IDAgJiYgbnggPCBuICYmIG55IDwgbSAmJiBhcltueF1bbnldID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBhcltueF1bbnldID0gMjsgLy8gaW5mZWN0IHRoZSBoZWFsdGh5IGNlbGwKICAgICAgICAgICAgICAgICAgICBoZWFsdGh5LS07CiAgICAgICAgICAgICAgICAgICAgcS5wdXNoKHtueCwgbnl9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aW1lKys7IC8vIG9uZSBzZWNvbmQgcGFzc2VzIGFmdGVyIHByb2Nlc3NpbmcgZWFjaCBsZXZlbAogICAgfQoKICAgIC8vIElmIHNvbWUgaGVhbHRoeSBjZWxscyBhcmUgc3RpbGwgbGVmdCwgcmV0dXJuIC0xCiAgICByZXR1cm4gKGhlYWx0aHkgPT0gMCkgPyB0aW1lIDogLTE7Cn0KCmludCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgTiwgTTsKICAgIGNpbiA+PiBOID4+IE07CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGdyaWQoTiwgdmVjdG9yPGludD4oTSkpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBNOyBqKyspIHsKICAgICAgICAgICAgY2luID4+IGdyaWRbaV1bal07CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgbWluVGltZShncmlkKSA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0K