#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;

}