#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vb = vector<bool>;
using vd = vector<double>;
using vs = vector<string>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pdd = pair<double, double>;
using vpii = vector<pii>;
using vvpii = vector<vpii>;
using vpll = vector<pll>;
using vvpll = vector<vpll>;
using vpdd = vector<pdd>;
using vvpdd = vector<vpdd>;
template <typename T>
void ckmin(T& a, const T& b) {
  a = min(a, b);
}
template <typename T>
void ckmax(T& a, const T& b) {
  a = max(a, b);
}
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
namespace __input {
template <class T1, class T2>
void re(pair<T1, T2>& p);
template <class T>
void re(vector<T>& a);
template <class T, size_t SZ>
void re(array<T, SZ>& a);
template <class T>
void re(T& x) {
  cin >> x;
}
void re(double& x) {
  string t;
  re(t);
  x = stod(t);
}
template <class Arg, class... Args>
void re(Arg& first, Args&... rest) {
  re(first);
  re(rest...);
}
template <class T1, class T2>
void re(pair<T1, T2>& p) {
  re(p.first, p.second);
}
template <class T>
void re(vector<T>& a) {
  for (int i = 0; i < (int((a).size())); i++) re(a[i]);
}
template <class T, size_t SZ>
void re(array<T, SZ>& a) {
  for (int i = 0; i < (SZ); i++) re(a[i]);
}
}  // namespace __input
using namespace __input;
namespace __output {
template <class T1, class T2>
void pr(const pair<T1, T2>& x);
template <class T, size_t SZ>
void pr(const array<T, SZ>& x);
template <class T>
void pr(const vector<T>& x);
template <class T>
void pr(const deque<T>& x);
template <class T>
void pr(const set<T>& x);
template <class T1, class T2>
void pr(const map<T1, T2>& x);
template <class T>
void pr(const T& x) {
  cout << x;
}
template <class Arg, class... Args>
void pr(const Arg& first, const Args&... rest) {
  pr(first);
  pr(rest...);
}
template <class T1, class T2>
void pr(const pair<T1, T2>& x) {
  pr("{", x.first, ", ", x.second, "}");
}
template <class T, bool pretty = true>
void prContain(const T& x) {
  if (pretty) pr("{");
  bool fst = 1;
  for (const auto& a : x) pr(!fst ? pretty ? ", " : " " : "", a), fst = 0;
  if (pretty) pr("}");
}
template <class T>
void pc(const T& x) {
  prContain<T, false>(x);
  pr("\n");
}
template <class T, size_t SZ>
void pr(const array<T, SZ>& x) {
  prContain(x);
}
template <class T>
void pr(const vector<T>& x) {
  prContain(x);
}
template <class T>
void pr(const deque<T>& x) {
  prContain(x);
}
template <class T>
void pr(const set<T>& x) {
  prContain(x);
}
template <class T1, class T2>
void pr(const map<T1, T2>& x) {
  prContain(x);
}
void ps() { pr("\n"); }
template <class Arg>
void ps(const Arg& first) {
  pr(first);
  ps();
}
template <class Arg, class... Args>
void ps(const Arg& first, const Args&... rest) {
  pr(first, " ");
  ps(rest...);
}
}  // namespace __output
using namespace __output;
namespace __algorithm {
template <typename T>
void dedup(vector<T>& v) {
  sort((v).begin(), (v).end());
  v.erase(unique((v).begin(), (v).end()), v.end());
}
template <typename T>
typename vector<T>::iterator find(vector<T>& v, const T& x) {
  auto it = lower_bound((v).begin(), (v).end(), x);
  return it != v.end() && *it == x ? it : v.end();
}
template <typename T>
size_t index(vector<T>& v, const T& x) {
  auto it = find(v, x);
  assert(it != v.end() && *it == x);
  return it - v.begin();
}
template <typename C, typename T, typename OP>
vector<T> prefixes(const C& v, T id, OP op) {
  vector<T> r(int((v).size()) + 1, id);
  for (int i = 0; i < (int((v).size())); i++) r[i + 1] = op(r[i], v[i]);
  return r;
}
template <typename C, typename T, typename OP>
vector<T> suffixes(const C& v, T id, OP op) {
  vector<T> r(int((v).size()) + 1, id);
  for (int i = (int((v).size())) - 1; i >= 0; i--) r[i] = op(v[i], r[i + 1]);
  return r;
}
}  // namespace __algorithm
using namespace __algorithm;
struct monostate {
  friend istream& operator>>(istream& is,
                             const __attribute__((unused)) monostate& ms) {
    return is;
  }
  friend ostream& operator<<(ostream& os,
                             const __attribute__((unused)) monostate& ms) {
    return os;
  }
} ms;
template <typename W = monostate>
struct wedge {
  int u, v, i;
  W w;
  wedge<W>(int _u = -1, int _v = -1, int _i = -1) : u(_u), v(_v), i(_i) {}
  int operator[](int loc) const { return u ^ v ^ loc; }
  friend void re(wedge& e) {
    re(e.u, e.v, e.w);
    --e.u, --e.v;
  }
  friend void pr(const wedge& e) { pr(e.u, "<-", e.w, "->", e.v); }
};
namespace __io {
void setIn(string second) { freopen(second.c_str(), "r", stdin); }
void setOut(string second) { freopen(second.c_str(), "w", stdout); }
void setIO(string second = "") {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(15);
  if (int((second).size())) {
    setIn(second + ".in"), setOut(second + ".out");
  }
}
}  // namespace __io
using namespace __io;
int main() {
  setIO();
  int N;
  re(N);
  struct ct {
    int a, b, c;
  } me;
  re(me.a, me.b, me.c);
  vector<ct> nohack, hack;
  int sa = !!me.a, sb = !!me.b, sc = !!me.c;
  int ha = 0, hb = 0, hc = 0;
  for (int i = (1); i < (N); i++) {
    ct opp;
    auto& [a, b, c] = opp;
    re(a, b, c);
    sa += !!a, sb += !!b, sc += !!c;
    ha += a < 0, hb += b < 0, hc += c < 0;
    (min({a, b, c}) < 0 ? hack : nohack).push_back(opp);
  }
  if (ha + hb + hc >= 90) {
    ps(1);
    return 0;
  }
  auto score = [&N](int k) {
    if (32 * k <= N) return 3000;
    if (32 * k <= 2 * N) return 2500;
    if (16 * k <= 2 * N) return 2000;
    if (8 * k <= 2 * N) return 1500;
    if (4 * k <= 2 * N) return 1000;
    return 500;
  };
  auto decay = [](int pv, int t) {
    if (t == 0) return 0;
    return pv * (250 - abs(t)) / 250;
  };
  int ans = 5001;
  for (int a = 0; a < (ha + 1); a++)
    if ((a == ha) || (score(sa - a - 1) > score(sa - a))) {
      for (int b = 0; b < (hb + 1); b++)
        if ((b == hb) || (score(sb - b - 1) > score(sb - b))) {
          for (int c = 0; c < (hc + 1); c++)
            if ((c == hc) || (score(sc - c - 1) > score(sc - c))) {
              int av = score(sa - a), bv = score(sb - b), cv = score(sc - c);
              auto eval = [&](ct res, int h) {
                return (((h & 1) && (res.a < 0) ? 0 : decay(av, res.a)) +
                        (((h & 2) && (res.b < 0) ? 0 : decay(bv, res.b))) +
                        (((h & 4) && (res.c < 0) ? 0 : decay(cv, res.c))));
              };
              int ms = eval(me, 0) + 100 * (a + b + c), lose = 0;
              vector<ct> targ;
              for (auto& p : nohack)
                if (eval(p, 0) > ms) lose++;
              for (auto& p : hack)
                if (eval(p, 0) > ms) lose++, targ.push_back(p);
              int rec[a + 1][b + 1][c + 1], best = 0;
              memset(rec, 0, sizeof(rec));
              for (auto& p : targ)
                for (int ai = (a + 1) - 1; ai >= 0; ai--)
                  for (int bi = (b + 1) - 1; bi >= 0; bi--)
                    for (int ci = (c + 1) - 1; ci >= 0; ci--) {
                      for (int ta = 0; ta < (2 - !ai); ta++)
                        for (int tb = 0; tb < (2 - !bi); tb++)
                          for (int tc = 0; tc < (2 - !ci); tc++) {
                            ckmax(
                                rec[ai][bi][ci],
                                rec[ai - ta][bi - tb][ci - tc] +
                                    (eval(p, 1 * ta + 2 * tb + 4 * tc) <= ms));
                            ckmax(best, rec[ai][bi][ci]);
                          }
                    }
              ckmin(ans, 1 + lose - best);
            }
        }
    }
  ps(ans);
  return 0;
}
