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.util.*;
import java.io.*;
import java.math.*;

public class C{
	
	static long sqr(long x) {return (x*x);}
	static double dotP(point5D x, point5D y) {
		return ( (x.a*y.a)
				+(x.b*y.b)
				+(x.c*y.c)
				+(x.d*y.d)
				+(x.e*y.e)
				);
	};
	
	static class point5D{
		public long a,b,c,d,e,sqrD;
		static double dist;
		public point5D() throws Exception{
			a=reader.nextLong();
			b=reader.nextLong();
			c=reader.nextLong();
			d=reader.nextLong();
			e=reader.nextLong();
			sqrD=sqr(a)+sqr(b)+sqr(c)+sqr(d)+sqr(e)+sqr(a);
			dist=Math.sqrt((double)sqrD);
		}
		public point5D(long a,long b,long c,long d, long e) throws Exception{
			this.a=a; 
			this.b=b; 
			this.c=c; 
			this.d=d; 
			this.e=e; 
			sqrD=sqr(a)+sqr(b)+sqr(c)+sqr(d)+sqr(e)+sqr(a);
			dist=Math.sqrt((double)sqrD);
		}
	}
	static point5D vectorAB(point5D A, point5D B) throws Exception {
		return new point5D(
				B.a-A.a,
				B.b-A.b,
				B.c-A.c,
				B.d-A.d,
				B.e-A.e);
	}
	static point5D a[];
	static int n; 
	static ArrayList <Integer>res;
	static ArrayList<point5D> v=new ArrayList<point5D>();
	static boolean isG(int i) throws Exception{
		int j,k;
		v.clear();
		for (j=0;j<n;j++) if (j!=i) {
			v.add(vectorAB(a[i], a[j]));
		}
		for (j=0;j<v.size();j++) {
			for (k=j+1;k<v.size();k++) {
				if (dotP(v.get(j),v.get(k))>0.0)	 return false;
						
			
				
			}
		}
		return true;
	}
	static double rA=Math.PI/2.0;
	static void MainMethod()throws Exception{
		n=reader.nextInt();
		a=new point5D[n];
		int i,j,k;
		for (i=0;i<n;i++)a[i]=new point5D();
		res=new ArrayList<Integer>();
		res.clear(); 
		for (i=0;i<n;i++) {
			if (isG(i)==true) {
				res.add(i+1);
			}
		}
		printer.println(res.size());
		for (i=0;i<res.size();i++)printer.print(res.get(i)+" ");
	}
	public static void main(String[] args)throws Exception{
		MainMethod();
		printer.close();
	}
	static void halt(){
		printer.close();
		System.exit(0);
	}
	static PrintWriter printer=new PrintWriter(new OutputStreamWriter(System.out));
	static class reader{
		static BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
		static StringTokenizer token=new StringTokenizer("");
		static String readNextLine() throws Exception{
			return bReader.readLine();
		}
		static String next() throws Exception{
			while (token.hasMoreTokens()==false){
				token=new StringTokenizer(bReader.readLine());
			}
			return token.nextToken();
		}
		static int nextInt()throws Exception{
			while (token.hasMoreTokens()==false){
				token=new StringTokenizer(bReader.readLine());
			}
			return Integer.parseInt(token.nextToken());
		}
		static long nextLong()throws Exception{
			while (token.hasMoreTokens()==false){
				token=new StringTokenizer(bReader.readLine());
			}
			return Long.parseLong(token.nextToken());
		}
		static double nextDouble()throws Exception{
			while (token.hasMoreTokens()==false){
				token=new StringTokenizer(bReader.readLine());
			}
			return Double.parseDouble(token.nextToken());
		}
	}
	static class MyMathCompute{
		static long [][] MatrixMultiplyMatrix(long [][] A, long [][] B, long mod) throws Exception{
			int n=A.length, m=B[0].length; 
			int p=A[0].length;
			int i,j,k;
			if (B.length!=p) throw new Exception("invalid matrix input");
			long [][] res=new long [n][m];
			for (i=0;i<n;i++) for (j=0;j<m;j++){
				if (A[i].length!=p) throw new Exception("invalid matrix input");
				res[i][j]=0;
				for (k=0;k<p;k++)
					res[i][j]=(res[i][j]+((A[i][k]*B[k][j])% mod))% mod;
			}
			return res;
		}
		static double [][] MatrixMultiplyMatrix(double [][] A, double [][] B ) throws Exception{
			int n=A.length, m=B[0].length; 
			int p=A[0].length;
			int i,j,k;
			if (B.length!=p) throw new Exception("invalid matrix input");
			double [][] res=new double [n][m];
			for (i=0;i<n;i++) for (j=0;j<m;j++){
				if (A[i].length!=p) throw new Exception("invalid matrix input");
				res[i][j]=0;
				for (k=0;k<p;k++)
					res[i][j]=res[i][j]+(A[i][k]*B[k][j]);
			}
			return res;
		}
		static long [][] MatrixPow(long [][] A,long n, long mod) throws Exception{
			if (n==1) return A;
			long [][] res=MatrixPow(A, n/2, mod);
			res=MatrixMultiplyMatrix(res, res, mod);
			if ((n % 2) == 1) res=MatrixMultiplyMatrix(A,res, mod);		
			return res;
		}
		static double [][] MatrixPow(double [][] A,long n) throws Exception{
			if (n==1) return A;
			double[][] res=MatrixPow(A, n/2);
			res=MatrixMultiplyMatrix(res, res);
			if ((n % 2) == 1) res=MatrixMultiplyMatrix(A,res);		
			return res;
		}
		static long pow(long a,long n,long mod){
			a= a % mod;
			if (n==0) return 1;
			long k=pow(a,n/2,mod);
			if ((n % 2)==0) return ((k*k)%mod);
			else return (((k*k) % mod)*a) % mod;
		}
		static double pow(double a,long n){
			if (n==0) return 1;
			double k=pow(a,n/2);
			if ((n % 2)==0) return (k*k);
			else return (((k*k) )*a) ;
		}
	}
}
