#include <bits/stdc++.h>
using namespace std;
int f1[1000], f2[1000], a[200][200];
void swap(int &n, int &m) {
  int temp;
  temp = n;
  n = m;
  m = temp;
}
int getmin(int x, int y) {
  if (x < y) return x;
  return y;
}
void getf2(int m) {
  int i;
  for (i = 1; i <= m; i++) f2[i] = (1 + f1[i]) % 2;
}
void getnum(int index, int m) {
  int i, t1;
  for (i = 1; i <= m; i++) f1[i] = 0;
  t1 = 0;
  while (index) {
    f1[++t1] = index & 1;
    index = index / 2;
  }
}
int getf(int index, int m, int *p) {
  int i, tot;
  tot = 0;
  for (i = 1; i <= m; i++)
    if (a[index][i] != p[i]) tot++;
  return tot;
}
int main() {
  int n, m, k, i, j, x, _min, pt;
  scanf("%d%d%d", &n, &m, &k);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= m; j++) {
      scanf("%d", &x);
      if (n > m)
        a[i][j] = x;
      else
        a[j][i] = x;
    }
  if (n < m) swap(n, m);
  _min = 100000;
  if (n <= 10) {
    for (i = 0; i <= ((1 << m) - 1); i++) {
      if (i == 5) {
        int kgt = 0;
      }
      getnum(i, m);
      getf2(m);
      pt = 0;
      for (j = 1; j <= n; j++) pt += getmin(getf(j, m, f1), getf(j, m, f2));
      if (pt < _min) _min = pt;
    }
  } else {
    for (i = 1; i <= n; i++) {
      for (j = 1; j <= m; j++) f1[j] = a[i][j];
      getf2(m);
      pt = 0;
      for (j = 1; j <= n; j++) pt += getmin(getf(j, m, f1), getf(j, m, f2));
      if (pt < _min) _min = pt;
    }
  }
  if (_min <= k) {
    printf("%d\n", _min);
    return 0;
  } else {
    printf("-1\n");
    return 0;
  }
  return 0;
}
