int main() { freopen("a", "r", stdin); while (scanf("%d%d%d", &N, &M, &K) != EOF) { if (N == 0 && M == 0 && K == 0) break; for (int i = 0; i < N; i++) for (int j = 0; j < K; j++) { scanf("%d", &need[i][j]); //printf("%dneed\n", need[i][j]); } for (int i = 0; i < M; i++) for (int j = 0; j < K; j++) { scanf("%d", &have[i][j]); //printf("%dhave\n", have[i][j]); } for (int k = 0; k < K; k++) for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) { scanf("%d", &cost[k][i][j]); //printf("%dcost\n", cost[k][i][j]); } bool ok = true; for (int i = 0; i < K; i++) { int allNeed = 0, allHave = 0; for (int j = 0; j < N; j++) allNeed += need[j][i]; for (int j = 0; j < M; j++) allHave += have[j][i]; if (allNeed > allHave) { ok = false; printf("-1\n"); break; } } if (!ok) continue; int ans = 0; for (int k = 0; k < K; k++) { int X = 0, Y = 0; for (int i = 0; i < N; i++) for (int j = 1; j <= need[i][k]; j++) A[X++] = i; for (int i = 0; i < M; i++) for (int j = 1; j <= have[i][k]; j++) B[Y++] = i; km.init(X, Y); for (int i = 0; i < X; i++) for (int j = 0; j < Y; j++) { km.addEdge(i, j, -cost[k][A[i]][B[j]]); //cout << i << " " << j << cost[k][A[i]][B[j]] << endl; } ans += -km.solve(); } printf("%d\n", ans); } return 0; }