#include<cstdio>
#include<utility>
#include<vector>
#include<cmath>
#include<algorithm>

using namespace std;
/*
typedef pair<int,int> P;
typedef pair<P,int> PP;
*/

typedef double Real;

const Real eps=1e-9;

template<class T> bool eq(T a,T b){
	return abs(a-b)<=eps;
}

template<class T> int sgn(T a){
	if(eq(a,0.0)) return 0;
	if(a>0) return 1;
	return -1;
}

int N;
int xs[220],ys[220],us[220],vs[220];

//map<PP,int> cnt;

vector<Real> vals;
int num;

void push(int a,int b,int c,int d,int e,int f,int g,int h){
	int A=c*h-d*g;
	int B=a*h+c*f-b*g-d*e;
	int C=a*f-b*e;
	if(A==0){
		if(B==0){
			if(C==0){
				num++;
			}
			return;
		}
		Real t=-(Real)C/B;
		if(sgn(t)>=0){
			vals.push_back(t);
		}
		return;
	}
	if(B*B-4*A*C<0){
		return;
	}
	if(B*B-4*A*C==0){
		Real t=-(Real)B/(A*2);
		if(sgn(t)>=0) vals.push_back(t);
		return;
	}
	Real s=sqrt(B*B-4*A*C);
	Real t1=(-B+s)/(A*2);
	if(sgn(t1)>=0) vals.push_back(t1);
	Real t2=(-B-s)/(A*2);
	if(sgn(t2)>=0) vals.push_back(t2);
}

void init(){
	vals.clear();
	num=0;
}

int solve(int id1,int id2){
//	printf("%d %d\n",id1,id2);
	init();
	int x1=xs[id1],y1=ys[id1],u1=us[id1],v1=vs[id1];
	int x2=xs[id2],y2=ys[id2],u2=us[id2],v2=vs[id2];
	for(int i=0;i<N;i++){
		if(i==id1||i==id2) continue;
		int x=xs[i],y=ys[i],u=us[i],v=vs[i];
//		printf("%d %d %d %d %d %d %d %d\n",x1-x,y1-y,u
		push(x1-x,y1-y,u1-u,v1-v,x2-x,y2-y,u2-u,v2-v);
//		printf("pushed %d\n",i);
	}
//	printf("c\n");
	int Ma=0;
	Real t;
	for(int i=0;i<vals.size();i++){
		Real v=vals[i];
		int tmp=0;
		if(eq(xs[id1]+us[id1]*v,xs[id2]+us[id2]*v)&&eq(ys[id1]+vs[id1]*v,ys[id2]+vs[id2]*v)) continue;
//		printf("%f\n",v);
		for(int j=i;j<vals.size();j++){
			if(eq(v,vals[j])){
				tmp++;
			}
		}
//		if(tmp+num+2==N){
//			printf("%d %d\n",id1,id2);
//			printf("%f %d\n",v,num);
//		for(int j=0;j<N;j++){
//			printf("%f %f\n",xs[j]+us[j]*v,ys[j]+vs[j]*v);
//		}
//		}
		Ma=max(Ma,tmp);
	}
//	printf("num=%d\n",num);
	return Ma+num+2;
}

bool all_same(){
	for(int i=0;i<N;i++) for(int j=i+1;j<N;j++){
		if(xs[i]!=xs[j]||ys[i]!=ys[j]||us[i]!=us[j]||vs[i]!=vs[j]){
			return false;
		}
	}
	return true;
}

Real get(int x1,int u1,int x2,int u2){
	if(u1==u2){
		if(x1==x2) return -1;
		else return -2;
	}
	return (Real)(x2-x1)/(u1-u2);
}

int main(){
	scanf("%d",&N);
	for(int i=0;i<N;i++){
		scanf("%d%d%d%d",xs+i,ys+i,us+i,vs+i);
	}
	if(N<=2){
		printf("%d\n",N);
		return 0;
	}
	if(all_same()){
		printf("%d\n",N);
		return 0;
	}
//	printf("a\n");
	bool flg=false;
	for(int i=0;i<N;i++) for(int j=i+1;j<N;j++){
		Real tx=get(xs[i],us[i],xs[j],us[j]);
		Real ty=get(ys[i],vs[i],ys[j],vs[j]);
		if(eq(tx,-2.0)||eq(ty,-2.0)) continue;
		if(eq(tx,-1.0)&&eq(ty,-1.0)) continue;
		Real t;
		if(eq(tx,-1.0)) t=ty;
		else t=tx;
		if(eq(tx,-1.0)==false&&eq(tx,t)==false) continue;
		if(eq(ty,-1.0)==false&&eq(ty,t)==false) continue;
		if(sgn(t)<0) continue;
		Real X=xs[0]+t*us[0];
		Real Y=ys[0]+t*vs[0];
		bool tmp=true;
		for(int k=0;k<N;k++){
			Real cx=xs[k]+t*us[k];
			Real cy=ys[k]+t*vs[k];
			if(eq(X,cx)==false||eq(Y,cy)==false){
				tmp=false;
			}
		}
		if(tmp) flg=true;
	}
//	printf("b\n");
	ed:;
	if(flg){
		printf("%d\n",N);
		return 0;
	}
	int ans=0;
//	printf("c\n");
	for(int i=0;i<N;i++) for(int j=i+1;j<N;j++){
		if(xs[i]==xs[j]&&ys[i]==ys[j]&&us[i]==us[j]&&vs[i]==vs[j]){
			continue;
		}
//		printf("a %d %d\n",i,j);
		int cur=solve(i,j);
		ans=max(ans,cur);
	}
//	printf("d\n");
	if(ans==0){
		printf("%d\n",N);
	}else{
		printf("%d\n",ans);
	}
	return 0;
}

Measured memory_bytes: 1064