#include <bits/stdc++.h>
using namespace std;
bool SR(int &x) { return scanf("%d", &x) == 1; }
bool SR(long long &x) { return scanf("%lld", &x) == 1; }
bool SR(double &x) { return scanf("%lf", &x) == 1; }
bool SR(char *s) { return scanf("%s", s) == 1; }
bool RI() { return true; }
template <typename I, typename... T>
bool RI(I &x, T &...tail) {
  return SR(x) && RI(tail...);
}
void SP(const int x) { printf("%d", x); }
void SP(const long long x) { printf("%lld", x); }
void SP(const double x) { printf("%.16lf", x); }
void SP(const char *s) { printf("%s", s); }
void PL() { puts(""); }
template <typename I, typename... T>
void PL(const I x, const T... tail) {
  SP(x);
  if (sizeof...(tail)) putchar(' ');
  PL(tail...);
}
const int maxn = 1e2 + 2;
vector<bool> a[maxn];
int n, m, k;
void read() {
  RI(n, m, k);
  for (int i = 0; i < int(n); i++) a[i].resize(m);
  for (int i = 0; i < int(n); i++)
    for (int j = 0; j < int(m); j++) {
      int x;
      RI(x);
      a[i][j] = (x == 1);
    }
}
void build() {}
int doo(const vector<bool> &v) {
  int ans = 0;
  for (int i = 0; i < int(n); i++) {
    int c[2] = {0, 0};
    for (int j = 0; j < int(m); j++) c[v[j] ^ a[i][j]]++;
    ans += min(c[0], c[1]);
  }
  return ans;
}
void sol() {
  int ans = k + 1;
  if (n > 10) {
    for (int i = 0; i < int(n); i++) ans = min(ans, doo(a[i]));
  } else {
    vector<bool> c[maxn];
    for (int i = 0; i < int(m); i++) c[i].resize(n);
    for (int i = 0; i < int(n); i++)
      for (int j = 0; j < int(m); j++) c[j][i] = a[i][j];
    swap(n, m);
    for (int i = 0; i < int(n); i++) a[i] = c[i];
    vector<bool> v(m);
    for (int i = 0; i < int((1 << m)); i++) {
      for (int j = 0; j < int(m); j++) v[j] = ((i >> j) & 1);
      ans = min(ans, doo(v));
    }
  }
  if (ans <= k)
    PL(ans);
  else
    PL(-1);
}
int main() {
  read();
  build();
  sol();
  return 0;
}
