#include <iostream>
#include <queue>
using namespace std;
struct node{
int x,y,s;
}t;
queue<node>q;
int n,m,nx[4] = {-1,1,0,0},ny[4] = {0,0,-1,1},f = 4000,ans[21][21],wx,wy;
char mp[21][21] = {};
bool vis[21][21] = {};
int main(){
cin >> n >> m;
char c;
for(int i = 0;i < n;i ++){
for(int j = 0;j < m;j ++){
cin >> c;
if(c == '.') c = '0';
mp[i][j] = c;
ans[i][j]= 40010;
}
}
for(int i = 0;i < n;i ++){
for(int j = 0;j < m;j ++){
if(mp[i][j] == 'Z'){
vis[i][j] = 1;
q.push({i,j,0});
ans[i][j] = 0;
int x,y;
while(!q.empty()){
t = q.front();
q.pop();
for(int k = 0;k < 4;k ++){
x = t.x + nx[k];
y = t.y + ny[k];
if(x >= 0 && x < n && y >= 0 && y < m && mp[x][y] != '#'){
if(mp[x][y] == 'W') ans[x][y] = min(ans[x][y],t.s + 1);
if(!vis[x][y] || ans[x][y] > t.s + mp[x][y] - '0' + 1){
vis[x][y] = 1;
ans[x][y] = min(ans[x][y],t.s + mp[x][y] - '0' + 1);
q.push({x,y,ans[x][y]});
}
//if(mp[x][y] >= '0' && mp[x][y] <= '9') q.push({x,y,t.s + mp[x][y] - '0' + 1});
//else q.push({x,y,t.s + 1});
vis[x][y] = 1;
}
}
}
}
if(mp[i][j] == 'W'){
wx = i,wy = j;
}
}
}
if(ans[wx][wy] != 40010) cout << ans[wx][wy];
else cout << "IMPOSSIBLE";
}