#include #define REP(i,n) for(int i=0,i##_len=(n);i>N; vector> X(N,vector(N)),graph(N); REP(i,N) REP(j,N){ cin>>X[i][j]; if(X[i][j]) graph[i].push_back(j); } vector A(N); REP(i, N){ cin >> A[i]; } int ans=INT_MAX; vector B(N,false); REP(bit,1<>j&1){ res+=A[j]; } B.assign(N,false); bool flag=true; queue que; REP(i,N){ if(~bit>>i&1) que.push(i); while(!que.empty()&&flag){ int now=que.front();que.pop(); B[now]=true; for(auto e:graph[now]){ if(e==i) flag=false; if(~bit>>e&1){ que.push(e); } } } } if(flag) ans=min(ans,res); } cout<