#include <bits/stdc++.h>
using namespace std;
const int limite = 5010;
int absolut(int x) {
  if (x < 0) return -x;
  return x;
}
void maximiza(int &a, int b) { a = max(a, b); }
void escribe(string s, int v[3]) {
  cout << s << ":" << v[0] << "," << v[1] << "," << v[2] << endl;
}
int n;
int t[limite][3];
int positivos[3];
int negativos[3];
int caso[3];
int inf[3];
int sup[3];
int factor[3];
void calculainfsup(int j) {
  if (caso[j] == 5) {
    inf[j] = -1;
    sup[j] = n;
    factor[j] = 1 << 5;
  } else {
    inf[j] = n;
    sup[j] = 2 * n;
    factor[j] = 1 << (caso[j] + 1);
  }
}
void calculainfsup() {
  for (int j = 0; j < 3; j++) calculainfsup(j);
}
int calculapuntos(int i, int j) {
  if (t[i][j] == 0) return 0;
  return 2 * (caso[j] + 1) * (250 - absolut(t[i][j]));
}
int calculapuntos(int i) {
  int p = 0;
  for (int j = 0; j < 3; j++) p += calculapuntos(i, j);
  return p;
}
int calculapuntospierde(int i) {
  int p = 0;
  for (int j = 0; j < 3; j++)
    if (t[i][j] < 0) p += calculapuntos(i, j);
  return p;
}
int maxh[3];
int h[3];
int maximo[100][100][100];
int nextmaximo[100][100][100];
int inicial[100][100][100];
int pierde[3];
void copia(int v[100][100][100], int u[100][100][100]) {
  for (int i0 = maxh[0]; i0 >= 0; i0--)
    for (int i1 = maxh[1]; i1 >= 0; i1--)
      for (int i2 = maxh[2]; i2 >= 0; i2--) u[i0][i1][i2] = v[i0][i1][i2];
}
int sol = 1000000000;
void calcula() {
  calculainfsup();
  for (int j = 0; j < 3; j++) {
    for (int k = 0; k <= n; k++) {
      if (inf[j] < factor[j] * k and factor[j] * k <= sup[j] and
          positivos[j] <= k and k <= positivos[j] + negativos[j]) {
        maxh[j] = positivos[j] + negativos[j] - k;
        break;
      }
      if (k == n) return;
    }
  }
  int puntos1 = calculapuntos(1);
  for (int j = 0; j < 3; j++) puntos1 += 100 * maxh[j];
  int tiosencima = 0;
  copia(inicial, maximo);
  for (int i = 2; i <= n; i++) {
    int puntos = calculapuntos(i);
    if (puntos <= puntos1) continue;
    tiosencima++;
    if (puntos1 < puntos - calculapuntospierde(i)) continue;
    copia(maximo, nextmaximo);
    for (int c = 1; c <= 7; c++) {
      int puntospierde = 0;
      bool error = false;
      for (int j = 0; j < 3 and not error; j++) {
        pierde[j] = (c & (1 << j)) != 0;
        error = pierde[j] and t[i][j] >= 0;
        if (pierde[j]) puntospierde += calculapuntos(i, j);
      }
      if (error or puntos1 < puntos - puntospierde) continue;
      for (int i0 = maxh[0]; i0 >= 0; i0--)
        for (int i1 = maxh[1]; i1 >= 0; i1--)
          for (int i2 = maxh[2]; i2 >= 0; i2--)
            maximiza(nextmaximo[i0 + pierde[0]][i1 + pierde[1]][i2 + pierde[2]],
                     maximo[i0][i1][i2] + 1);
    }
    copia(nextmaximo, maximo);
  }
  sol = min(sol, 1 + tiosencima - maximo[maxh[0]][maxh[1]][maxh[2]]);
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < 3; j++) {
      cin >> t[i][j];
      positivos[j] += t[i][j] > 0;
      negativos[j] += t[i][j] < 0;
    }
  }
  if (90 <= negativos[0] + negativos[1] + negativos[2]) {
    cout << 1 << endl;
    exit(0);
  }
  for (int casos = 0; casos < 6 * 6 * 6; casos++) {
    caso[0] = casos % 6;
    caso[1] = casos / 6 % 6;
    caso[2] = casos / 36;
    calcula();
  }
  cout << sol << endl;
}
