#include <iostream>
#include <queue>
#include <cstdlib>
#include <string.h>
using namespace std;
typedef pair<int,int> pii;
struct ed{
int x;
int y;
int p;
ed(){}
ed(int a,int b,int c):x(a),y(b),p(c){}
};
int A[55][55][10100];
queue< ed > Q;
char v[55][55];
char ZZ[10100];
int L;
ed a;
pii Cache[55][55][4];
int ddx[4] = {1,-1,0,0};
int ddy[4] = {0,0,1,-1};
void Push(int o){
int x,y;
if (Cache[a.x][a.y][o].first!=0){
if (Cache[a.x][a.y][o].first == -1)
return ;
x = Cache[a.x][a.y][o].first;
y = Cache[a.x][a.y][o].second;
} else {
int dx = ddx[o];
int dy = ddy[o];
x = a.x;
y = a.y;
while (v[x][y] == v[a.x][a.y]){
x+=dx;
y+=dy;
}
Cache[a.x][a.y][o] = pii(x,y);
if (!v[x][y]){
Cache[a.x][a.y][o].first = -1;
return;
}
}
int p = a.p;
while (v[x][y] == ZZ[p]) p++;
if (A[x][y][p]) return;
if (p == L){
cout << A[a.x][a.y][a.p] + 1;
exit(0);
}
A[x][y][p] = A[a.x][a.y][a.p] + 1;
Q.push( ed(x,y,p));
}
int main(){
int N,M;
cin >> N >> M;
for (int i=1;i<=N;i++)
for (int j=1;j<=M;j++)
cin >> v[i][j];
cin >> ZZ;
L = strlen(ZZ);
ZZ[L] = '*';
ZZ[++L] = 0;
int p =0;
while (v[1][1] == ZZ[p]) p++;
Q.push ( ed(1,1,p) );
A[1][1][p] = L;
while ( true){
a = Q.front();
Q.pop();
Push(0);
Push(1);
Push(2);
Push(3);
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8c3RyaW5nLmg+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAp0eXBlZGVmIHBhaXI8aW50LGludD4gcGlpOwogCnN0cnVjdCBlZHsKICAgaW50IHg7CiAgIGludCB5OwogICBpbnQgcDsKICAgZWQoKXt9CiAgIGVkKGludCBhLGludCBiLGludCBjKTp4KGEpLHkoYikscChjKXt9Cn07CiAKaW50IEFbNTVdWzU1XVsxMDEwMF07CnF1ZXVlPCBlZCA+IFE7CmNoYXIgdls1NV1bNTVdOwpjaGFyIFpaWzEwMTAwXTsKaW50IEw7CmVkIGE7CiAKcGlpIENhY2hlWzU1XVs1NV1bNF07CmludCBkZHhbNF0gPSB7MSwtMSwwLDB9OwppbnQgZGR5WzRdID0gezAsMCwxLC0xfTsKIAp2b2lkIFB1c2goaW50IG8pewogICAgaW50IHgseTsKICAgIGlmIChDYWNoZVthLnhdW2EueV1bb10uZmlyc3QhPTApewogICAgICAgIGlmIChDYWNoZVthLnhdW2EueV1bb10uZmlyc3QgPT0gLTEpCiAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgeCA9IENhY2hlW2EueF1bYS55XVtvXS5maXJzdDsKICAgICAgICB5ID0gQ2FjaGVbYS54XVthLnldW29dLnNlY29uZDsKICAgIH0gZWxzZSB7CiAgICBpbnQgZHggPSBkZHhbb107CiAgICBpbnQgZHkgPSBkZHlbb107CiAgICAgICAgeCA9IGEueDsKICAgICAgICB5ID0gYS55OyAgICAgICAgCiAgICAgICAgd2hpbGUgKHZbeF1beV0gPT0gdlthLnhdW2EueV0pewogICAgICAgICAgICAgICAgeCs9ZHg7CiAgICAgICAgICAgICAgICB5Kz1keTsgIAogICAgICAgIH0KICAgIENhY2hlW2EueF1bYS55XVtvXSA9IHBpaSh4LHkpOwogICAgICAgIGlmICghdlt4XVt5XSl7CiAgICAgICAgQ2FjaGVbYS54XVthLnldW29dLmZpcnN0ID0gLTE7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9Cn0KICAgIGludCBwID0gYS5wOwogICAgICAgIHdoaWxlICh2W3hdW3ldID09IFpaW3BdKSBwKys7CiAgICAgICAgaWYgKEFbeF1beV1bcF0pIHJldHVybjsKICAgICAgICBpZiAocCA9PSBMKXsKICAgICAgICAgICAgICAgIGNvdXQgPDwgQVthLnhdW2EueV1bYS5wXSArIDE7CiAgICAgICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KICAgICAgICBBW3hdW3ldW3BdID0gQVthLnhdW2EueV1bYS5wXSArIDE7CiAgICAgICAgUS5wdXNoKCBlZCh4LHkscCkpOwp9CiAKaW50IG1haW4oKXsKICAgIGludCBOLE07CiAgICBjaW4gPj4gTiA+PiBNOwogICAgZm9yIChpbnQgaT0xO2k8PU47aSsrKQogICAgICAgIGZvciAoaW50IGo9MTtqPD1NO2orKykKICAgICAgICAgICAgICAgIGNpbiA+PiB2W2ldW2pdOwogICBjaW4gPj4gWlo7CiAgIEwgPSBzdHJsZW4oWlopOwogICBaWltMXSA9ICcqJzsKICAgWlpbKytMXSA9IDA7CiAgIGludCBwID0wOwogICB3aGlsZSAodlsxXVsxXSA9PSBaWltwXSkgcCsrOwogICBRLnB1c2ggKCBlZCgxLDEscCkgICk7CiAgIEFbMV1bMV1bcF0gPSBMOwogICB3aGlsZSAoIHRydWUpewogICAgICAgIGEgPSBRLmZyb250KCk7CiAgICAgICAgUS5wb3AoKTsKICAgICAgICBQdXNoKDApOwogICAgICAgIFB1c2goMSk7CiAgICAgICAgUHVzaCgyKTsKICAgICAgICBQdXNoKDMpOwogICB9Cn0=