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.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class C {
	static double wanted = Math.PI/2.0;
	static Point[] arr;
	
	public static double dot(Point a ,Point b) {
		return a.a*b.a + a.b*b.b + a.c*b.c + a.d*b.d + a.e*b.e;
	}
	
	public static double mod(Point a) {
		return Math.sqrt(a.a*a.a + a.b*a.b + a.c*a.c + a.d*a.d + a.e*a.e);
	}
	
	public static Point vector(Point a, Point b) {
		return new Point(b.a - a.a, b.b -a.b, b.c - a.c, b.d - a.d, b.e - a.e);
	}
	
	public static double angle(Point a , Point b) {
		return Math.acos((dot(a,b)/(mod(a)*mod(b))));
	}
	
	public static boolean check(Point p) {
		ArrayList<Point> vectors = new ArrayList<>();
		for (int i = 0; i < arr.length; i++) {
			if(!p.equals(arr[i])) {
				vectors.add(vector(p,arr[i]));
			}
		}
		int count = 0;
		for (int i = 0; i < vectors.size(); i++) {
			Point v = vectors.get(i);
			for (int j = 0; j < vectors.size(); j++) {
				if(i != j) {
					if(angle(v,vectors.get(j)) < wanted) {
						count++;
					}
				}
				if(count>= 2) return false;
			}
		}
		return true;
	}
	
	public static void main(String[] args) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw = new PrintWriter(System.out);
		StringTokenizer st;
		ArrayList<Integer> result = new ArrayList<>();
		int n = Integer.parseInt(bf.readLine());
		arr = new Point[n];
		for (int i = 0; i < arr.length; i++) {
			st = new StringTokenizer(bf.readLine());
			arr[i] = new Point(Integer.parseInt(st.nextToken()), 
					Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), 
					Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
		}
		for (int i = 0; i < arr.length; i++) {
			if(check(arr[i])) {
				result.add(i+1);
			}
		}
		pw.println(result.size());
		for (int i = 0; i < result.size(); i++) {
			pw.println(result.get(i));
		}
		pw.close();
	}
	
	static class Point{
		int a,b,c,d,e;
		public Point(int ax, int bx , int cx , int dx , int ex ) {
			a = ax;
			b = bx;
			c = cx;
			d = dx;
			e = ex;
		}
		
		public boolean equals(Point a) {
			return this.a == a.a && this.b == a.b && this.c == a.c && this.d == a.d && this.e == a.e;
		}
	}
}
