#include <bits/stdc++.h>
namespace FASTIO {
char buf[1 << 21];
char *p1, *p2;
template <typename T>
inline void wt(T x, char c = '\n') {
  if (x < 0) {
    x = -x;
    putchar('-');
  }
  static char sta[sizeof(T) * 8];
  T top = 0;
  do {
    sta[top++] = x % 10;
    x /= 10;
  } while (x);
  while (top) putchar(sta[--top] + '0');
  putchar(c);
}
template <typename T>
inline T rd() {
  T sum = 0, fl = 1;
  char ch =
      (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
           ? EOF
           : *p1++);
  for (; ch < '0' || ch > '9';
       ch = (p1 == p2 &&
                     (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                 ? EOF
                 : *p1++))
    if (ch == '-')
      fl = -1;
    else if (ch == EOF)
      exit(0);
  for (; '0' <= ch && ch <= '9';
       ch = (p1 == p2 &&
                     (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                 ? EOF
                 : *p1++))
    sum = sum * 10 + ch - '0';
  return sum * fl;
}
}  // namespace FASTIO
using namespace FASTIO;
struct vec5 {
  int v[5];
  void get() {
    for (int i = 0; i < 5; i++) v[i] = rd<int>();
  }
  inline vec5 operator-(const vec5 &B) const {
    vec5 res = *this;
    for (int i = 0; i < 5; i++) res.v[i] -= B.v[i];
    return res;
  }
  inline int operator*(const vec5 &B) const {
    int ans = 0;
    for (int i = 0; i < 5; i++) ans += v[i] * B.v[i];
    return ans;
  }
  inline double abs() const { return sqrt(*this * *this); }
  inline double angle(const vec5 &B) {
    return acos((*this * B) / ((double)abs() * B.abs()));
  }
};
int n;
std::vector<vec5> V;
int main() {
  n = rd<int>();
  V.resize(n);
  for (vec5 &v : V) v.get();
  std::vector<bool> ans;
  ans.resize(n);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (j != i)
        for (int k = j + 1; k < n; k++)
          if (k != i)
            if (std::abs((V[k] - V[i]).angle(V[j] - V[i])) + 1e-6 <
                1.57079632679489661923) {
              ans[i] = true;
              j = k = n;
            }
  std::vector<int> res;
  res.reserve(n);
  for (int i = 0; i < n; i++)
    if (!ans[i]) res.push_back(i);
  wt(res.size());
  for (const int &r : res) wt(r + 1);
  return 0;
}

### Prompt

Construct a cpp code solution to the problem outlined:

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>
namespace FASTIO {
char buf[1 << 21];
char *p1, *p2;
template <typename T>
inline void wt(T x, char c = '\n') {
  if (x < 0) {
    x = -x;
    putchar('-');
  }
  static char sta[sizeof(T) * 8];
  T top = 0;
  do {
    sta[top++] = x % 10;
    x /= 10;
  } while (x);
  while (top) putchar(sta[--top] + '0');
  putchar(c);
}
template <typename T>
inline T rd() {
  T sum = 0, fl = 1;
  char ch =
      (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
           ? EOF
           : *p1++);
  for (; ch < '0' || ch > '9';
       ch = (p1 == p2 &&
                     (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                 ? EOF
                 : *p1++))
    if (ch == '-')
      fl = -1;
    else if (ch == EOF)
      exit(0);
  for (; '0' <= ch && ch <= '9';
       ch = (p1 == p2 &&
                     (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
                 ? EOF
                 : *p1++))
    sum = sum * 10 + ch - '0';
  return sum * fl;
}
}  // namespace FASTIO
using namespace FASTIO;
struct vec5 {
  int v[5];
  void get() {
    for (int i = 0; i < 5; i++) v[i] = rd<int>();
  }
  inline vec5 operator-(const vec5 &B) const {
    vec5 res = *this;
    for (int i = 0; i < 5; i++) res.v[i] -= B.v[i];
    return res;
  }
  inline int operator*(const vec5 &B) const {
    int ans = 0;
    for (int i = 0; i < 5; i++) ans += v[i] * B.v[i];
    return ans;
  }
  inline double abs() const { return sqrt(*this * *this); }
  inline double angle(const vec5 &B) {
    return acos((*this * B) / ((double)abs() * B.abs()));
  }
};
int n;
std::vector<vec5> V;
int main() {
  n = rd<int>();
  V.resize(n);
  for (vec5 &v : V) v.get();
  std::vector<bool> ans;
  ans.resize(n);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (j != i)
        for (int k = j + 1; k < n; k++)
          if (k != i)
            if (std::abs((V[k] - V[i]).angle(V[j] - V[i])) + 1e-6 <
                1.57079632679489661923) {
              ans[i] = true;
              j = k = n;
            }
  std::vector<int> res;
  res.reserve(n);
  for (int i = 0; i < n; i++)
    if (!ans[i]) res.push_back(i);
  wt(res.size());
  for (const int &r : res) wt(r + 1);
  return 0;
}

```