#include<bits/stdc++.h>
#define ll long long
#define mp make_pair
#define se second
#define fi first
using namespace std;
const ll N=51;
ll n,m,dis[N][N][N][N],gx[9]={0,0,-1,1},gy[9]={1,-1,0,0},vis[N][N][N];
char a[N][N];queue<pair<ll,pair<ll,ll>>>que;
struct node{ll x,y,step,pos;};
inline void BFS(ll x,ll y)
{
dis[x][y][x][y]=0;
que.push(mp(x,mp(y,0)));
while(!que.empty())
{
pair<ll,pair<ll,ll>> now=que.front();
que.pop();
for(int i=0;i<4;i++)
{
ll xx=now.fi,yy=now.se.fi,nx=xx+gx[i],ny=yy+gy[i];
while(nx>0 && nx<=n && ny>0 && ny<=m && a[nx][ny]==a[xx][yy])
xx=nx,yy=ny,nx=xx+gx[i],ny=yy+gy[i];
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(dis[x][y][nx][ny]>now.se.se+1)
{
dis[x][y][nx][ny]=now.se.se+1;
que.push(mp(nx,mp(ny,dis[x][y][nx][ny])));
}
}
}
}
int main()
{
ll sum=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j],
sum+=a[i][j]=='*';
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
BFS(i,j);
string to;
cin>>to;to+="*";
queue<node>que;
que.push(node{1,1,0,0});
ll minn=INT_MAX,time_use=0;
memset(vis,0,sizeof(vis));
while(!que.empty())
{
node now=que.front();que.pop();
if(vis[now.x][now.y][now.pos]) continue;
vis[now.x][now.y][now.pos]=now.step;
if(now.pos==to.size())
{
minn=min(minn,now.step);
time_use++;
continue;
}
if(a[now.x][now.y]==to[now.pos])
que.push(node{now.x,now.y,now.step+1,now.pos+1});
else
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==to[now.pos] && dis[now.x][now.y][i][j]<=INT_MAX && (vis[i][j][now.pos+1]>now.step+dis[now.x][now.y][i][j]+1 || vis[i][j][now.pos+1]==0))
que.push(node{i,j,now.step+dis[now.x][now.y][i][j]+1,now.pos+1});
}
cout<<minn;
return 0;
}