#include <stdio.h>

#define INF 100000000

#define DIR_UP		0
#define DIR_RIGHT	1
#define DIR_DOWN	2
#define DIR_LEFT	3

const int dx[4]={0,1,0,-1};
const int dy[4]={-1,0,1,0};

/* [y][x[dir]][next_dir] */
int node_cost[30][30][4];
int node_rinsetu_cost[30][30][4][4];
int kakutei[30][30][4];

int w,h;
int board[30][30];
int c[4];

int getboard(int y,int x) {
	if(y<0 || y>=h || x<0 || x>=w)return 5;
	return board[y][x];
}

int main(void) {
	int i,j,k,l;
	int nx,ny,nd;
	int ans;
	for(;;) {
		scanf("%d%d",&w,&h);
		if(w==0 && h==0)break;
		for(i=0;i<h;i++) {
			for(j=0;j<w;j++)scanf("%d",&board[i][j]);
		}
		for(i=0;i<4;i++)scanf("%d",&c[i]);
		for(i=0;i<h;i++) {
			for(j=0;j<w;j++) {
				for(k=0;k<4;k++) {
					node_rinsetu_cost[i][j][k][k]=c[0];
					node_rinsetu_cost[i][j][k][(k+1)%4]=c[1];
					node_rinsetu_cost[i][j][k][(k+2)%4]=c[2];
					node_rinsetu_cost[i][j][k][(k+3)%4]=c[3];
					if(board[i][j]!=4) {
						node_rinsetu_cost[i][j][k][(k+board[i][j])%4]=0;
					}
				}
			}
		}
		for(i=0;i<h;i++) {
			for(j=0;j<w;j++) {
				for(k=0;k<4;k++) {
					node_cost[i][j][k]=INF;
					kakutei[i][j][k]=0;
				}
			}
		}
		node_cost[0][0][DIR_RIGHT]=0;
		nx=ny=0;nd=DIR_RIGHT;
		kakutei[0][0][DIR_RIGHT]=1;
		for(i=0;i<w*h*4;i++) {
			int mincost=INF;
			for(j=0;j<4;j++) {
				if(getboard(ny+dy[j],nx+dx[j])!=5) {
					if(node_cost[ny+dy[j]][nx+dx[j]][j]>
							node_cost[ny][nx][nd]+node_rinsetu_cost[ny][nx][nd][j]) {
						node_cost[ny+dy[j]][nx+dx[j]][j]=
							node_cost[ny][nx][nd]+node_rinsetu_cost[ny][nx][nd][j];
					}
				}
			}
			for(j=0;j<h;j++) {
				for(k=0;k<w;k++) {
					for(l=0;l<4;l++) {
						if(!kakutei[j][k][l] && node_cost[j][k][l]<mincost) {
							ny=j;
							nx=k;
							nd=l;
							mincost=node_cost[j][k][l];
						}
					}
				}
			}
			kakutei[ny][nx][nd]=1;
		}
		ans=INF;
		for(i=0;i<4;i++) {
			if(node_cost[h-1][w-1][i]<ans)ans=node_cost[h-1][w-1][i];
		}
		printf("%d\n",ans);
	}
	return 0;
}