求助::::::::::
//城市的顺序从1到m,不懂为什么 。。 还是顺序没有影响 。。
const int inf = 1<<30;
const int N = 1111;
int next[N][N], num[N], mny[N][12];
int cost[12], val[12][12], with[12][12];
int dp[N][12];
int n, m, nn, mm;
void init()
{
int i, j, k;
nn = 1<<n;
mm = 1<<m;
for(i=0; i<nn; i++) //next 和 num
{
num[i] = 0;
for(j=0; j<nn; j++)
if( (i|j)==i )
next[i][ num[i]++ ] = j;
}
for(i=0; i<nn; i++) //mny[i][j] 人数状态i 到第j个城市
{
int tmp = 0, cnt=0;
for(j=0; j<n; j++)
if( (1<<j)&i )
{
++cnt;
for(k=0; k<j; k++)
if( (1<<k)&i )
tmp += with[j][k];
}
for(j=0; j<m; j++)
{
mny[i][j] = tmp;
mny[i][j] -= cnt*cost[j];
for(k=0; k<n; k++)
if( (1<<k)&i )
mny[i][j] += val[k][j];
}
}
}
int solve()
{
int i, j, k;
for(i=0; i<nn; i++) for(j=0; j<m; j++) dp[i][j] = -inf;
for(i=0; i<nn; i++) dp[i][0] = mny[i][0];
for (i=1; i<m; i++)
for(j=0; j<nn; j++)
for(k=0; k<num[j]; k++)
dp[ next[j][k] ][i] = max( dp[ next[j][k] ][i], dp[j][i-1]+mny[ next[j][k] ][i] );
int ans = -inf;
for(i=0; i<nn; i++)
if(dp[i][m-1]>ans)
ans = dp[i][m-1];
return ans;
}
int main()
{
int i, j;
while(scanf("%d%d", &n, &m), n+m)
{
for(i=0; i<m; i++) scanf("%d", &cost[i]);
for(i=0; i<n; i++) for(j=0; j<m; j++) scanf("%d", &val[i][j]);
for(i=0; i<n; i++) for(j=0; j<n; j++) scanf("%d", &with[i][j]);
init();
int ans = solve();
if(ans>0) printf("%d\n",ans);
else printf("STAY HOME\n");
}
return 0;
}