#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int n,m;
int tp,ts,tt;
int sx,sy,ex,ey;
char graph[30][30];
bool vis[30][30];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
//t tree . sand # path @ stone
struct node{
int x,y,step;
friend bool operator < (node n1,node n2){
return n2.step < n1.step;
}
};
int bfs(){
priority_queue<node> q;
node cur,next;
cur.x = sx;
cur.y = sy;
cur.step = 0;
vis[cur.x][cur.y] = 1;
q.push(cur);
while(!q.empty()){
cur = q.top();
q.pop();
if(cur.x==ex && cur.y==ey)
return cur.step;
for(int i=0;i<4;i++){
next = cur;
next.x += dx[i];
next.y += dy[i];
if(next.x>=0 && next.x<n && next.y>=0 && next.y<m && !vis[next.x][next.y] && graph[next.x][next.y]!='@'){
if(graph[next.x][next.y]=='T')
next.step += tt;
else if(graph[next.x][next.y]=='.')
next.step += ts;
else if(graph[next.x][next.y]=='#')
next.step += tp;
vis[next.x][next.y] = 1;
q.push(next);
}
}
}
return -1;
}
int main(){
int cnt=1;
while(scanf("%d%d",&n,&m)!=EOF){
scanf("%d%d%d",&tp,&ts,&tt);
for(int i=0;i<n;i++)
scanf("%s",graph[i]);
memset(vis,false,sizeof(vis));
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
int res = bfs();
printf("Case %d: %d\n",cnt++,res);
}
return 0;
}