工程
using namespace std;
int nn,m,kk;
int f[201];
bool r[201];
//pair<int,int> road[201];
int deg[201];
int n[201],h[201],to[20001],cnt;
pair<int,int> s;//????
queue<pair<int,int> > q;
int g[10001];
int p[201];
int he[201];//????
int ans,ww;
void add(int u,int v)
{
n[++cnt]=h[u];
h[u]=cnt;
to[cnt]=v;
}
int main()
{
cin>>nn;
for(int i=1;i<=nn;i++)
cin>>f[i];
for(int i=1;i<=nn;i++)
for(int j=1;j<=nn;j++)
{
if(i==j)
continue;
cin>>kk;
if(kk==1)
deg[i]++,add(j,i);
}
for(int i=1;i<=nn;i++)
if(!deg[i])
q.push(make_pair(i,1)),g[i]=1,he[i]=f[i];
while(!q.empty())
{
s=q.front();
q.pop();
for(int j=h[s.first];j;j=n[j])
{
deg[to[j]]--;
he[to[j]]=max(he[to[j]],he[s.first]+f[to[j]]);
if(!deg[to[j]])
{
q.push(make_pair(to[j],s.second+1));
g[to[j]]=s.second+1;
}
}
}
for(int i=1;i<=nn;i++)
if(deg[i]!=0)
{
cout<<"-1";
return 0;
}
for(int i=1;i<=nn;i++)
ans=max(ans,he[i]);
cout<<ans;
return 0;
}