#if defined(_USE_PCH_)
#include "pch.hpp"
#else
#include <bits/stdc++.h>
#endif
#define RNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_<=V_##_END; V_++)
#define IRNG(V_, A_, B_, ...) for(int V_=(A_), V_##_END=(B_) __VA_OPT__(,) __VA_ARGS__; V_>=V_##_END; V_--)
#ifdef _WIN32
#define long int64_t
#endif
#define fi first
#define se second
#define _UN using namespace
using namespace std;
const int MAXN=100,INF=0x3f3f3f3f; const long NINFL=0xc0c0c0c0c0c0c0c0;
int n,ti[MAXN],cst[MAXN],A[MAXN][MAXN]; long tot;
struct {
static const int MAXN=1e3,MAXM=1e6;
struct{ int v,nxt; long f,c; } E[MAXM]; int head[MAXN],nedg,deg[MAXN],st,ed;
int cur[MAXN]; long dis[MAXN],res; bool vis[MAXN];
void init(){ nedg=1,memset(head,0,sizeof(head)),memset(deg,0,sizeof(deg)),res=0; }
void _add(int u,int v,long f,long c){ E[++nedg]={v,head[u],f,c}; }
void add(int u,int v,long f,long c){ _add(u,v,f,c),_add(v,u,0,-c); }
void ins(int u,int v,long f,long c){
if(c>0) res+=f*c,add(v,u,f,-c),deg[u]-=f,deg[v]+=f;
else add(u,v,f,c);
}
bool spfa(){
memset(dis,0xc0,sizeof(dis)),dis[st]=0;
queue<int> q; q.push(st);
while(q.size()){
int u=q.front(); q.pop(),vis[u]=0;
for(int i=head[u]; i; i=E[i].nxt){
int v=E[i].v;
if(E[i].f&&dis[v]<dis[u]+E[i].c){
dis[v]=dis[u]+E[i].c;
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
return dis[ed]>NINFL;
}
pair<long,long> dfs(int u,long f){
if(u==ed||!f) return f;
long r=0,s=0;
for(int i=cur[u]; i; cur[u]=i=E[i].nxt){
int v=E[i].v;
if(E[i].f&&dis[v]==dis[u]+E[i].c){
auto [x,y]=dfs(v,min(f,E[i].f));
r+=x,f-=x,E[i].f-=x,E[i^1].f+=x,s+=y+E[i].c*x;
}
}
return {r,s};
}
long dinic(){
RNG(i,0,MAXN-1){
if(deg[i]<0) add(st,i,-deg[i]);
else if(deg[i]>0) add(i,ed,deg[i]);
}
while(spfa()){
memcpy(cur,head,sizeof(head));
res+=dfs(st,INF).second;
}
return res;
}
} G;
void check(int lim){
G.init();
auto le=[](int u,int v,int a)/* u-v<=a */{ G.ins(v,u,INF,-a); }
// l[i]=2i,r[i]=2i+1,l0=1,r0=2n+2,G.st=2n+3,G.ed=2n+4
G.st=2*n+3,G.ed=2*n+4;
RNG(i,1,n){
le(2*i,2*i+1,0),le(1,2*i,0),le(2*i+1,2*n+2);
}
RNG(i,1,n){
RNG(j,1,n){
if(A[i][j]) le(2*j+1,2*i,0);
}
}
le(2*n+2,1,lim);
}
int main(){
#if defined(_LOCAL_)
freopen("in","r",stdin);
freopen("out","w",stdout);
// freopen("/dev/null","w",stderr);
#else
// freopen("travel.in","r",stdin);
// freopen("travel.out","w",stdout);
#endif
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>n;
{
char tmp[MAXN];
RNG(i,1,n){
cin>>(tmp+1);
RNG(j,1,n) A[i][j]=tmp[j]-'0';
}
}
{ int _; cin>>_; }
RNG(i,1,n) cin>>ti[i];
{ int _; cin>>_; }
RNG(i,1,n) cin>>cst[i];
cin>>tot;
}