#include<bits/stdc++.h>
using namespace std;
int n,m,hd[110][110],pd[110][110],vish[110][110],visp[110][110];
char mapp[110][110];
int xt[4]={0,0,1,-1};
int yt[4]={1,-1,0,0};
struct node{
int x;
int y;
};
void bfs1(int stx,int sty){
node a={stx,sty};
queue<node> q;
q.push(a);
int dep=0;
hd[stx][sty]=dep;vish[stx][sty]=1;
while(!q.empty()){
int x=q.front().x;
int y=q.front().y;
q.pop();
dep++;
for(int i=0;i<=n;i++){
int tx=x+xt[i];
int ty=y+yt[i];
if(tx<1||tx>n||ty<1||ty>m||hd[ty][tx]<=dep||mapp[tx][ty]=='X'||vish[tx][ty]==1){
continue;
}
else{
node newn;
newn.x=tx;
newn.y=ty;
q.push(newn);
hd[tx][ty]=dep;
vish[tx][ty]=1;
}
}
}
return ;
}
void bfs2(int stx,int sty){
node a={stx,sty};
queue<node> q;
q.push(a);
int dep=0;
hd[stx][sty]=dep;
visp[stx][sty]=1;
while(!q.empty()){
int x=q.front().x;
int y=q.front().y;
q.pop();
dep++;
for(int i=0;i<=n;i++){
int tx=x+xt[i];
int ty=y+yt[i];
if(tx<1||tx>n||ty<1||ty>m||hd[ty][tx]+1<=dep||mapp[tx][ty]=='X'||visp[tx][ty]==1){
continue;
}
else{
node newn;
newn.x=tx;
newn.y=ty;
q.push(newn);
pd[tx][ty]=dep;
visp[tx][ty]=1;
}
}
}
return ;
}
int main(){
//freopen("slikar.in","r",stdin);
//freopen("slikar.out","w",stdout);
cin>>n>>m;
int edx,edy,bex,bey;
memset(hd,0x3f3f3f,sizeof(hd));
memset(pd,0x3f3f3f,sizeof(pd));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mapp[i][j];
if(mapp[i][j]='S'){
bex=i;
bey=j;
}
if(mapp[i][j]='*'){
bfs1(i,j);
}
}
}
bfs2(bex,bey);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<pd[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<hd[i][j]<<" ";
}
cout<<endl;
}
if(pd[edx][edy]==0||pd[edx][edy]>hd[edx][edy]) cout<<"KAKTUS";
else cout<<pd[edx][edy];
//fclose(stdin);
//fclose(stdout);
}