#include <bits/stdc++.h>
template <class T>
inline void qread(T& x) {
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  if (f) x = -x;
}
inline int qread() {
  int x = 0;
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  return f ? -x : x;
}
template <class T>
inline T Max(const T x, const T y) {
  return x > y ? x : y;
}
template <class T>
inline T Min(const T x, const T y) {
  return x < y ? x : y;
}
template <class T>
inline T fab(const T x) {
  return x > 0 ? x : -x;
}
inline int gcd(const int a, const int b) { return b ? gcd(b, a % b) : a; }
inline void getInv(int inv[], const int lim, const int MOD) {
  inv[0] = inv[1] = 1;
  for (int i = 2; i <= lim; ++i)
    inv[i] = 1ll * inv[MOD % i] * (MOD - MOD / i) % MOD;
}
template <class T>
void fwrit(const T x) {
  if (x < 0) return (void)(putchar('-'), fwrit(-x));
  if (x > 9) fwrit(x / 10);
  putchar(x % 10 ^ 48);
}
inline long long mulMod(const long long a, const long long b,
                        const long long mod) {
  return ((a * b - (long long)((long double)a / mod * b + 1e-8) * mod) % mod +
          mod) %
         mod;
}
const int MAXN = 1e3;
struct point {
  int a[6];
} p[MAXN + 5];
int n, tail;
int ans[MAXN + 5];
bool flg;
int calc;
signed main() {
  scanf("%d", &n);
  for (signed i = 1, i_end_ = n; i <= i_end_; ++i)
    for (signed j = 1, j_end_ = 5; j <= j_end_; ++j) p[i].a[j] = qread();
  if (n > 11) return puts("0"), 0;
  for (signed i = 1, i_end_ = n; i <= i_end_; ++i) {
    flg = false;
    for (signed j = 1, j_end_ = n; j <= j_end_; ++j)
      if (i ^ j) {
        for (signed k = 1, k_end_ = n; k <= k_end_; ++k)
          if (k ^ i && k ^ j) {
            calc = 0;
            for (signed t = 1, t_end_ = 5; t <= t_end_; ++t)
              calc += (p[i].a[t] - p[j].a[t]) * (p[i].a[t] - p[k].a[t]);
            if (calc > 0) {
              flg = true;
              break;
            }
          }
        if (flg) break;
      }
    if (!flg) ans[++tail] = i;
  }
  fwrit(tail), putchar('\n');
  for (signed i = 1, i_end_ = tail; i <= i_end_; ++i)
    fwrit(ans[i]), putchar(' ');
  putchar('\n');
  return 0;
}

### Prompt

Generate a CPP solution to the following problem:

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.

### Response

```cpp
#include <bits/stdc++.h>
template <class T>
inline void qread(T& x) {
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  if (f) x = -x;
}
inline int qread() {
  int x = 0;
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  return f ? -x : x;
}
template <class T>
inline T Max(const T x, const T y) {
  return x > y ? x : y;
}
template <class T>
inline T Min(const T x, const T y) {
  return x < y ? x : y;
}
template <class T>
inline T fab(const T x) {
  return x > 0 ? x : -x;
}
inline int gcd(const int a, const int b) { return b ? gcd(b, a % b) : a; }
inline void getInv(int inv[], const int lim, const int MOD) {
  inv[0] = inv[1] = 1;
  for (int i = 2; i <= lim; ++i)
    inv[i] = 1ll * inv[MOD % i] * (MOD - MOD / i) % MOD;
}
template <class T>
void fwrit(const T x) {
  if (x < 0) return (void)(putchar('-'), fwrit(-x));
  if (x > 9) fwrit(x / 10);
  putchar(x % 10 ^ 48);
}
inline long long mulMod(const long long a, const long long b,
                        const long long mod) {
  return ((a * b - (long long)((long double)a / mod * b + 1e-8) * mod) % mod +
          mod) %
         mod;
}
const int MAXN = 1e3;
struct point {
  int a[6];
} p[MAXN + 5];
int n, tail;
int ans[MAXN + 5];
bool flg;
int calc;
signed main() {
  scanf("%d", &n);
  for (signed i = 1, i_end_ = n; i <= i_end_; ++i)
    for (signed j = 1, j_end_ = 5; j <= j_end_; ++j) p[i].a[j] = qread();
  if (n > 11) return puts("0"), 0;
  for (signed i = 1, i_end_ = n; i <= i_end_; ++i) {
    flg = false;
    for (signed j = 1, j_end_ = n; j <= j_end_; ++j)
      if (i ^ j) {
        for (signed k = 1, k_end_ = n; k <= k_end_; ++k)
          if (k ^ i && k ^ j) {
            calc = 0;
            for (signed t = 1, t_end_ = 5; t <= t_end_; ++t)
              calc += (p[i].a[t] - p[j].a[t]) * (p[i].a[t] - p[k].a[t]);
            if (calc > 0) {
              flg = true;
              break;
            }
          }
        if (flg) break;
      }
    if (!flg) ans[++tail] = i;
  }
  fwrit(tail), putchar('\n');
  for (signed i = 1, i_end_ = tail; i <= i_end_; ++i)
    fwrit(ans[i]), putchar(' ');
  putchar('\n');
  return 0;
}

```