const z:array[1..8,1..2]of -1..1=((1,0),(0,1),(-1,0),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1));
var i,j,k:longint;m,n:longint;ans:array[0..101,0..101]of longint;boo:array[0..101,0..101]of boolean;num:array[0..501]of real;sum2:array[0..501]of longint;x,y:array[0..161]of longint;lastx,lasty:array[0..501]of array[0..161]of longint;sum,add:longint;ch:char;out:array[0..26]of char;
procedure same(p,q:longint);//第p個圖形和第q個圖形全等,且第q個圖形在之前出現過
var i:longint;
beginfor i:=1 to sum2[q]do ans[lastx[q][i],lasty[q][i]]:=ans[lastx[p][1],lasty[p][1]];//把答案賦值成一樣的
end;
procedure new(p:longint);//第p個圖形在之前沒有出現過
var i:longint;
begininc(add);//種數++for i:=1 to sum2[p]doans[lastx[p][i],lasty[p][i]]:=add;//把該圖形賦值成這個
end;
function long(x1,y1,x2,y2:longint):real;//計算兩點之間距離
beginexit(sqrt(sqr(x1-x2)+sqr(y1-y2)));
end;
procedure bfs(fx,fy:longint);//BFS最喜歡了,其實dfs也可以
var i,j,k,h,t:longint;have:boolean;from:longint=0;
beginh:=1;t:=1;x[1]:=fx;y[1]:=fy;boo[fx,fy]:=false;repeatfor i:=1 to 8doif boo[x[t]+z[i,1],y[t]+z[i,2]] thenbegininc(h);x[h]:=x[t]+z[i,1];y[h]:=y[t]+z[i,2];boo[x[h],y[h]]:=false;end;inc(t);until t>h;inc(sum);num[sum]:=0;for i:=1 to h dofor j:=1 to h donum[sum]:=num[sum]+long(x[i],y[i],x[j],y[j]);//計算出一個點和別的點的距離之和lastx[sum]:=x;//把經過的位置保留下來lasty[sum]:=y;have:=false;sum2[sum]:=h;for i:=1 to sum-1doifabs(num[i]-num[sum])<0.0001 then//利用這個定理判斷這兩個圖形全等beginsame(i,sum);have:=true;from:=i;break;end;ifnot have then new(sum);//在之前沒有全等的圖形
end;
beginreadln(n);readln(m);for i:=1 to m dobeginfor j:=1 to n dobeginread(ch);if ch='1' then boo[i,j]:=true;end;readln;end;for i:=1 to m dofor j:=1 to n doif boo[i,j] thenbfs(i,j);out[0]:='0';//這樣輸出簡單for i:=1 to 26do out[i]:=chr(i+96);for i:=1 to m dobeginfor j:=1 to n dowrite(out[ans[i,j]]);//QAQwriteln;end;
end.