#include <iostream>
#include <queue>
#include <climits>
using namespace std;

class P{
public:
  int i,j,dir, cost;
  P(){};
  P( int I,int J, int d, int c ){
    i=I; j=J; dir=d; cost=c;
  }
  bool operator<(const P &p) const{
    return cost > p.cost; // queue 用に greater で定義
  }
};


int di[4] = { 0,1,0,-1 };
int dj[4] = { 1,0,-1,0 };

int main(){
  int o[30][30]; // マスに割り当てられた命令
  int c[4];      // 命令を与えた時のコスト
  int cost[30][30][4];
  int w,h;
  priority_queue<P> qu;
  P p;

  while( cin>>w>>h && (w||h) ){
    for( int i=0;i<h;i++ )
      for( int j=0;j<w;j++ ){
	cin >> o[i][j];
	for( int k=0;k<4;k++ )
	  cost[i][j][k]=INT_MAX;
      }
    for( int i=0;i<4;i++ )
      cin >> c[i];

    while( !qu.empty() ) qu.pop();
    qu.push( P(0,0,0,0) );

    int ans=0;
    while( !qu.empty() ){
      p=qu.top(); qu.pop(); // cost が最小のものを取り出す

      if( (p.i==h-1) && (p.j==w-1) ){
	//	cout << "***"<<endl;
	ans=p.cost;
	break;
      }
      if( (p.i<0) || (p.i>=h) ) continue;
      if( (p.j<0) || (p.j>=w) ) continue;

      
      if( cost[p.i][p.j][p.dir] <= p.cost ) continue;
      cost[p.i][p.j][p.dir] = p.cost;

      /*
      cout << p.i << "," << p.j << " "<<p.cost << endl;
      cout << "size="<<qu.size() << endl;
      if( qu.size()>10 )break;
      */

      for( int i=0;i<4;i++ ){ // 直進・右・反転・左　への移動
	int nextD = (i+p.dir)%4;;
	int ni=p.i+di[nextD], nj=p.j+dj[nextD];
	if( i==o[p.i][p.j] )	  qu.push( P(ni,nj,nextD,p.cost) );
	else                 	  qu.push( P(ni,nj,nextD,p.cost+c[i]) );
      }
      
    }
    cout << ans << endl;

    /*
    for( int k=0;k<4;k++ ){
      cout << "k="<<k<<endl;
      for( int i=0;i<h;i++ ){
	for( int j=0;j<w;j++ )
	  cout << cost[i][j][k] << "\t";
	cout << endl;
      }
    }
    */
  }
  return 0;
}