//printf("p[%d]=%d\n",i,p[i]);
}
// printf("%d\n",minl);
for(i=n+m+1;p[i]!=-1;i=p[i])
{
int j=p[i];
// printf("cost[%d][%d]=%d\n",j,i,cost[j][i]);
cost[j][i]-=minl;
cost[i][j]+=minl;
// printf("cost[%d][%d]=%d\n",j,i,cost[j][i]);
}
}
int main()
{
int i,j,kk;
while(scanf("%d%d%d",&n,&m,&k)&&(n||m||k))
{
mem(cost,0);
mem(head,-1);
num=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=k;j++)
{
scanf("%d",&need[i][j]);
}
}
for(i=1;i<=m;i++)
{
for(j=1;j<=k;j++)
{
scanf("%d",&give[i][j]);
}
}
for(kk=1;kk<=k;kk++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&fei[kk][i][j]);
// printf("%d %d %d %d\n",kk,i,j,fei[kk][i][j]);
}
}
}
int res=0;
int t;
for(t=1;t<=k;t++)
{
int n1,n2;
n1=n2=0;
for(i=1;i<=m;i++)
{
n1+=give[i][t];
}
for(i=1;i<=n;i++)
{
n2+=need[i][t];
if(n2>n1)
{
printf("-1\n");
break;
}
}
if(t!=k+1)continue;
for(t=1;t<=k;t++)
{
mem(cost,0);
mem(head,-1);
num=0;
// printf("*%d_____________________________________*\n",t);
for(i=1;i<=m;i++)
{
add(0,i,0);
add(i,0,0);
cost[0][i]=give[i][t];
cost[i][0]=0;
}
for(i=1;i<=n;i++)
{
add(i+m,n+m+1,0);
add(n+m+1,i+m,0);
cost[i+m][n+m+1]=need[i][t];
cost[n+m+1][i+m]=0;
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
add(i,j+m,fei[t][j][i]);
add(j+m,i,-fei[t][j][i]);
cost[i][j+m]=INF;
cost[j+m][i]=0;
// printf("%d %d %d\n",i,j+m,fei[t][j][i]);
}
}
while(spfa())
{
// printf("------\n");
zeng();
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
res+=fei[t][j][i]*(INF-cost[i][j+m]);
}
}
// printf("k=%d,res=%d\n",t,res);
}
printf("%d\n",res);
}
return 0;
}