}
for(j=1;j<=n;j++)
{
cap[m+j][m+n+1]=a[j][i];
}
sta=0; end=m+n+1;
s+=EK();
}
printf("%d\n",s);
}
return 0;
}
int bfs()
{
int i,j,base,top,x;
base=top=0;
for(i=0;i<=end;i++)
{
dis[i]=INF;
}
memset(status,0,sizeof(status));
queue[top++]=0;
dis[0]=0;
status[0]=1;
while(base
x=queue[base++];
status[x]=0;
for(i=1;i<=end;i++)
{
if(x!=i&&cap[x][i])
{
if(dis[i]>(dis[x]+cost[x][i]))
{
pre[i]=x;
dis[i]=(dis[x]+cost[x][i]);
if(!status[i])
{
status[i]=1;
queue[top++]=i;
}
}
}
}
}
if(dis[end]==INF)
{
return -1;
}else
{
return 1;
}
}
int EK()
{
int i,j,k,s=0;
int min=INF;
while(1)
{
k=bfs();
if(k==-1)
{
break;
}
for(i=end; i!=0; i=pre[i])
{
j=pre[i];
if(min>cap[j][i])
{
min=cap[j][i];
}
}
for(i=end; i!=0; i=pre[i])
{
j=pre[i];
s+=cost[j][i]*min;
cap[j][i]-=min;
cap[i][j]+=min;
}
}
return s;
}
#include
#include
#include
int cost[100][200],cap[100][200],dis[200];
int queue[1000000],pre[200],status[200];
int INF=0x7fffffff,sta,end;
int main()
{
int EK();
int i,j,n,m,s,t,k,u,s1,s2;
while(scanf("%d %d %d",&n,&m,&k)!=EOF)
{
if(n==0&&m==0&&k==0)
{
break;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=k;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=1;i<=m;i++)
{
for(j=1;j<=k;j++)
{
scanf("%d",&b[i][j]);
}
}
for(i=1;i<=k;i++)
{
for(j=1;j<=n;j++)
{
for(u=1;u<=m;u++)
{
scanf("%d",&c[i][j][u]);
}
}
}
for(i=1;i<=k;i++)
{
s1=0; s2=0;
for(j=1;j<=n;j++)
{
s1+=a[j][i];
}
for(j=1;j<=m;j++)
{
s2+=b[j][i];
}
if(s2
break;
}
}
if(i!=k+1)
{
printf("-1\n");
continue;
}
s=0;
for(i=1;i<=k;i++)
{
memset(cap,0,sizeof(cap));
memset(cost,0,sizeof(cost));
for(j=1;j<=m;j++)
{
cap[0][j]=b[j][i];
}
for(j=1;j<=m;j++)
{
for(u=1;u<=n;u++)
{
cap[j][m+u]=b[j][i];
cost[j][m+u]=c[i][u][j];
cost[m+u][j]=-1*c[i][u][j];
}
}
for(j=1;j<=n;j++)
{
cap[m+j][m+n+1]=a[j][i];
}
sta=0; end=m+n+1;
s+=EK();
}
pri