#include <bits/stdc++.h>
using namespace std;
struct Point {
  double coord[5];
};
Point read_point() {
  Point x;
  for (int i = 0; i < 5; i++) {
    cin >> x.coord[i];
  }
  return x;
}
Point vec(const Point &x, const Point &y) {
  Point ref;
  for (int t = 0; t < 5; t++) {
    ref.coord[t] = x.coord[t] - y.coord[t];
  }
  return ref;
}
bool sign(const Point &x, const Point &y) {
  int sign = 0;
  for (int i = 0; i < 5; i++) {
    sign += x.coord[i] * y.coord[i];
  }
  return sign > 0;
}
vector<Point> a;
vector<int> ans;
bool check(const Point &orig, const vector<Point> &neg) {
  for (int i = 0; i < neg.size(); i++) {
    Point to_check1 = vec(orig, neg[i]);
    for (int j = i + 1; j < neg.size(); j++) {
      Point to_check2 = vec(orig, neg[j]);
      if (sign(to_check1, to_check2)) {
        return false;
      }
    }
  }
  return true;
}
int main() {
  int n;
  cin >> n;
  if (n < 3) {
    cout << n << endl;
    for (int i = 0; i < n; i++) {
      cout << i + 1 << endl;
    }
    return 0;
  }
  a.resize(n);
  for (int i = 0; i < n; i++) {
    a[i] = read_point();
  }
  for (int i = 0; i < n; i++) {
    vector<Point> neg;
    Point ref;
    int st = 1;
    if (i == 0) {
      ref = vec(a[0], a[1]);
      st = 2;
    } else {
      ref = vec(a[i], a[0]);
    }
    int j = st;
    for (; j < n; j++) {
      if (j == i) {
        continue;
      }
      Point to_check = vec(a[i], a[j]);
      if (sign(ref, to_check)) {
        break;
      } else {
        neg.push_back(a[j]);
        if (neg.size() > 30) {
          break;
        }
      }
    }
    if (j != n) {
      continue;
    }
    if (check(a[i], neg)) {
      ans.push_back(i + 1);
    }
  }
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i] << endl;
  }
  return 0;
}
