#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int n, m;
vector<vector<int>> grid;
vector<vector<int>> vis;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
queue<pair<int,int>> q;
// DFS to mark the first island
void dfs(int x, int y){
vis[x][y] = 1;
grid[x][y] = 2; // mark first island
q.push({x, y}); // every cell becomes a BFS source
for(int k = 0; k < 4; k++){
int nx = x + dx[k];
int ny = y + dy[k];
if(nx >= 0 && nx < n && ny >= 0 && ny < m &&
!vis[nx][ny] && grid[nx][ny] == 1){
dfs(nx, ny);
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
grid.assign(n, vector<int>(m));
vis.assign(n, vector<int>(m, 0));
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin >> grid[i][j];
// Find first island
bool found = false;
for(int i = 0; i < n && !found; i++){
for(int j = 0; j < m && !found; j++){
if(grid[i][j] == 1){
dfs(i, j);
found = true;
}
}
}
vector<vector<int>> dist(n, vector<int>(m, 0));
// Multi-source BFS
while(!q.empty()){
auto [x, y] = q.front();
q.pop();
for(int k = 0; k < 4; k++){
int nx = x + dx[k];
int ny = y + dy[k];
if(nx < 0 || nx >= n || ny < 0 || ny >= m)
continue;
// Reached second island
if(grid[nx][ny] == 1){
cout << dist[x][y] << '\n';
return 0;
}
// Expand only through water
if(grid[nx][ny] == 0){
grid[nx][ny] = 2; // mark visited
dist[nx][ny] = dist[x][y] + 1;
q.push({nx, ny});
}
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCmludCBuLCBtOwp2ZWN0b3I8dmVjdG9yPGludD4+IGdyaWQ7CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gdmlzOwoKaW50IGR4W10gPSB7MCwgMCwgMSwgLTF9OwppbnQgZHlbXSA9IHsxLCAtMSwgMCwgMH07CgpxdWV1ZTxwYWlyPGludCxpbnQ+PiBxOwoKLy8gREZTIHRvIG1hcmsgdGhlIGZpcnN0IGlzbGFuZAp2b2lkIGRmcyhpbnQgeCwgaW50IHkpewogICAgdmlzW3hdW3ldID0gMTsKICAgIGdyaWRbeF1beV0gPSAyOyAgICAgICAgICAvLyBtYXJrIGZpcnN0IGlzbGFuZAoKICAgIHEucHVzaCh7eCwgeX0pOyAgICAgICAgICAvLyBldmVyeSBjZWxsIGJlY29tZXMgYSBCRlMgc291cmNlCgogICAgZm9yKGludCBrID0gMDsgayA8IDQ7IGsrKyl7CiAgICAgICAgaW50IG54ID0geCArIGR4W2tdOwogICAgICAgIGludCBueSA9IHkgKyBkeVtrXTsKCiAgICAgICAgaWYobnggPj0gMCAmJiBueCA8IG4gJiYgbnkgPj0gMCAmJiBueSA8IG0gJiYKICAgICAgICAgICAhdmlzW254XVtueV0gJiYgZ3JpZFtueF1bbnldID09IDEpewogICAgICAgICAgICBkZnMobngsIG55KTsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCl7CgogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4gPj4gbiA+PiBtOwoKICAgIGdyaWQuYXNzaWduKG4sIHZlY3RvcjxpbnQ+KG0pKTsKICAgIHZpcy5hc3NpZ24obiwgdmVjdG9yPGludD4obSwgMCkpOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IG07IGorKykKICAgICAgICAgICAgY2luID4+IGdyaWRbaV1bal07CgogICAgLy8gRmluZCBmaXJzdCBpc2xhbmQKICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbiAmJiAhZm91bmQ7IGkrKyl7CiAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IG0gJiYgIWZvdW5kOyBqKyspewogICAgICAgICAgICBpZihncmlkW2ldW2pdID09IDEpewogICAgICAgICAgICAgICAgZGZzKGksIGopOwogICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gZGlzdChuLCB2ZWN0b3I8aW50PihtLCAwKSk7CgogICAgLy8gTXVsdGktc291cmNlIEJGUwogICAgd2hpbGUoIXEuZW1wdHkoKSl7CgogICAgICAgIGF1dG8gW3gsIHldID0gcS5mcm9udCgpOwogICAgICAgIHEucG9wKCk7CgogICAgICAgIGZvcihpbnQgayA9IDA7IGsgPCA0OyBrKyspewoKICAgICAgICAgICAgaW50IG54ID0geCArIGR4W2tdOwogICAgICAgICAgICBpbnQgbnkgPSB5ICsgZHlba107CgogICAgICAgICAgICBpZihueCA8IDAgfHwgbnggPj0gbiB8fCBueSA8IDAgfHwgbnkgPj0gbSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgLy8gUmVhY2hlZCBzZWNvbmQgaXNsYW5kCiAgICAgICAgICAgIGlmKGdyaWRbbnhdW255XSA9PSAxKXsKICAgICAgICAgICAgICAgIGNvdXQgPDwgZGlzdFt4XVt5XSA8PCAnXG4nOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEV4cGFuZCBvbmx5IHRocm91Z2ggd2F0ZXIKICAgICAgICAgICAgaWYoZ3JpZFtueF1bbnldID09IDApewoKICAgICAgICAgICAgICAgIGdyaWRbbnhdW255XSA9IDI7ICAgICAgLy8gbWFyayB2aXNpdGVkCiAgICAgICAgICAgICAgICBkaXN0W254XVtueV0gPSBkaXN0W3hdW3ldICsgMTsKICAgICAgICAgICAgICAgIHEucHVzaCh7bngsIG55fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=