You are given set of n points in 5-dimensional space. The points are labeled from 1 to n. No two points coincide.

We will call point a bad if there are different points b and c, not equal to a, from the given set such that angle between vectors <image> and <image> is acute (i.e. strictly less than <image>). Otherwise, the point is called good.

The angle between vectors <image> and <image> in 5-dimensional space is defined as <image>, where <image> is the scalar product and <image> is length of <image>.

Given the list of points, print the indices of the good points in ascending order.

Input

The first line of input contains a single integer n (1 ≤ n ≤ 103) — the number of points.

The next n lines of input contain five integers ai, bi, ci, di, ei (|ai|, |bi|, |ci|, |di|, |ei| ≤ 103) — the coordinates of the i-th point. All points are distinct.

Output

First, print a single integer k — the number of good points.

Then, print k integers, each on their own line — the indices of the good points in ascending order.

Examples

Input

6
0 0 0 0 0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1


Output

1
1


Input

3
0 0 1 2 0
0 0 9 2 0
0 0 5 9 0


Output

0

Note

In the first sample, the first point forms exactly a <image> angle with all other pairs of points, so it is good.

In the second sample, along the cd plane, we can see the points look as follows:

<image>

We can see that all angles here are acute, so no points are good.
#include <bits/stdc++.h>
using namespace std;
struct Point {
  long long a, b, c, d, e;
  Point(long long a, long long b, long long c, long long d, long long e)
      : a(a), b(b), c(c), d(d), e(e) {}
};
struct vec {
  long long a, b, c, d, e;
  vec(Point p1, Point p2)
      : a(p2.a - p1.a),
        b(p2.b - p1.b),
        c(p2.c - p1.c),
        d(p2.d - p1.d),
        e(p2.e - p1.e) {}
};
long long sqr(long long x) { return x * x; }
long long operator*(vec v1, vec v2) {
  return v1.a * v2.a + v1.b * v2.b + v1.c * v2.c + v1.d * v2.d + v1.e * v2.e;
}
bool check(Point A, Point B, Point C) {
  vec v1(A, B);
  vec v2(A, C);
  return (v1 * v2 > 0 && sqr(v1 * v2) <= (v1 * v1) * (v2 * v2));
}
vector<Point> mas;
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(nullptr);
  int n;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    long long a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    mas.push_back(Point(a, b, c, d, e));
  }
  if (n <= 2) {
    cout << n << '\n';
    for (int i = 1; i <= n; ++i) cout << i << '\n';
    return 0;
  }
  vector<bool> bad(n + 1, 0);
  for (int i = 0; i < n; ++i) {
    int cnt1 = min(100, n - 1);
    bool ok = false;
    for (int j = 0; cnt1 > 0; ++j) {
      if (i != j) {
        cnt1--;
        int cnt2 = min(100, n - 2);
        for (int k = 0; cnt2 > 0; ++k) {
          if (i != k && j != k) {
            cnt2--;
            if (check(mas[i], mas[j], mas[k])) {
              ok = true;
              bad[i + 1] = 1;
            }
          }
          if (ok) break;
        }
      }
      if (ok) break;
    }
  }
  vector<int> ans;
  for (int i = 1; i <= n; ++i)
    if (!bad[i]) ans.push_back(i);
  cout << ans.size() << '\n';
  for (int i = 0; i < ans.size(); ++i) {
    cout << ans[i] << '\n';
  }
  return 0;
}
