#include<bits/stdc++.h>
const int MAXN=5e4+5,MAXK=55;
const int INF=0x7f7f7f7f;
typedef long long LL;
typedef std::pair<int,LL> PIL;
typedef std::pair<LL,int> PLI;
int n,k,b[MAXN],a[MAXK][MAXK];
LL dis[MAXN];
bool vis[MAXN];
std::vector<PIL> e[MAXN];
std::vector<int> v[MAXK];
inline void dij(int s)
{
std::priority_queue<PLI> pq;
pq.push(std::make_pair(0LL,s));
for(int i=1;i<=n;i++)
dis[i]=INF,
vis[i]=0;
dis[s]=0;
while(pq.size())
{
int u=pq.top().second;
pq.pop();
if(vis[u]) continue;
vis[u]=1;
for(auto it:e[u])
{
int v=it.first;
LL w=it.second;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v]) pq.push(std::make_pair(-dis[v],v));
}
}
}
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++) v[b[i]].push_back(i);
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
{
char ch;
std::cin>>ch;
a[i][j]=(ch^48);
}
for(int i=1;i<=k;i++)
for(int j=1;j<=k;j++)
{
if(a[i][j]==0) continue;
for(int it1:v[i])
for(int it2:v[j])
e[it1].push_back(std::make_pair(it2,abs(it1-it2)));
}
dij(1);
if(dis[n]==INF) printf("-1\n");
else printf("%lld\n",dis[n]);
return 0;
}