#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: 2788