import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
static int[] dy = {0, 0, 1, -1};
static int[] dx = {1, -1, 0, 0};
static int N, M;
static int[][] map, res;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
int startY = 0;
int startX = 0;
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<M; j++){
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j]==2){
startY = i;
startX = j;
}
}
}
res = new int[N][M];
bfs(startY, startX);
StringBuilder sb = new StringBuilder();
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
sb.append(res[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
static void bfs(int startY, int startX){
res[startY][startX] = 0;
Deque<int[]> queue = new ArrayDeque<>();
queue.offer(new int[] {startY, startX});
while(!queue.isEmpty()){
int[] curr = queue.poll();
int y = curr[0];
int x = curr[1];
for(int d=0; d<4; d++){
int ny = y+dy[d];
int nx = x+dx[d];
if(ny < 0 || ny >= N || nx < 0 || nx >= M) continue;
if(map[ny][nx] == 1 && res[ny][nx]==0){
res[ny][nx] = res[y][x]+1;
queue.offer(new int[] {ny, nx});
}
}
}
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
if(map[i][j]==1 && res[i][j]==0) res[i][j] = -1;
}
}
}
}