#pragma GCC optimize(3) #include <bits/stdc++.h> #define N 105 using namespace std; struct Node{ long long x; int Max; bitset<N> avl,vis; friend bool operator < (const Node &l,const Node &r){ return l.x>r.x; } }; int a[N]; int n,k; char s[N]; priority_queue <Node> S; long long ans; bitset <N> P[N]; int main() { scanf("%d%d",&n,&k); k--; if(k==0){ puts("0"); return 0; } for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++){ scanf("%s",s+1); for(int j=1;j<=n;j++) if(s[j]=='1')P[i][j]=1; } for(int i=1;i<=n;i++){ Node tmp; tmp.x=a[i]; tmp.avl=P[i]; tmp.vis[i] = 1; tmp.Max = i; S.push(tmp); } while(!S.empty()){ Node u = S.top(); S.pop(); ans = u.x; k--; if(!k){ printf("%lld\n",ans); return 0; } for(int j=u.Max+1;j<=n;j++) { if (u.avl[j]) { Node v; v.x = u.x + a[j]; v.avl = u.avl & P[j]; v.vis[j] = 1; v.vis |= u.vis; v.Max = j; S.push(v); } } } puts("-1"); return 0; }