var
f,p:array[0..300,0..300] of longint;
e,t,a,mi,h:array[0..300] of longint;
w:array[0..300] of boolean;
n,max,r:longint;
proceduress;var
l,i,j,k:longint;
begin
k:=n;
l:=1;r:=0;
for i:=1to n doif t[i]=0thenbegin inc(r);h[r]:=i;end;
while l<=r dobeginif t[h[l]]=0thenbegin
dec(k);
e[h[l]]:=mi[h[l]]+a[h[l]];
if e[h[l]]>max thenbegin
max:=e[h[l]];
for i:=1to p[0,0] do
p[0,i]:=0;
p[0,0]:=1;
p[0,1]:=h[l];
endelseif e[h[l]]=max thenbegin
inc(p[0,0]);
p[0,p[0,0]]:=h[l];
end;
for j:=1to n doif (f[j,h[l]]=1)and(h[l]<>j) thenbeginif e[h[l]]>mi[j] thenbegin
mi[j]:=e[h[l]];
for i:=1to p[j,0] do
p[j,i]:=0;
p[j,0]:=1;
p[j,1]:=h[l];
endelseif e[h[l]]=mi[j] thenbegin
inc(p[j,0]);
p[j,p[j,0]]:=h[l];
end;
dec(t[j]);
if t[j]=0thenbegin inc(r);h[r]:=j;end;
end;
end;
inc(l);
end;
end;
proceduredg(x:longint);var
i:longint;
begin
w[x]:=true;
for i:=1to p[x,0] do
dg(p[x,i]);
end;
var
i,j:longint;
begin
readln(n);
for i:=1to n doread(a[i]);
for i:=1to n dobeginfor j:=1to n doif i<>j thenbeginread(f[i,j]);
if f[i,j]=1then
inc(t[i]);
end;
readln;
end;
max:=-maxlongint;
ss;
if r<>n thenbegin writeln(-1);exit;end;
dg(0);
writeln(max);
for i:=1to n doif w[i] thenwrite(i,' ');
writeln;
end.