#include <iostream>
#include <complex>
#include <vector>
using namespace std;

#define EPS 1e-10

typedef complex<double> P;

vector<P> cross(P a,P b){
  vector<P> res;

  if(abs(abs(b-a) - 2.0) < EPS){
    P c = a + b;
    res.push_back( P(c.real()/2,c.imag()/2) );
  }
  else if(abs(b-a) < 2.0){
    P ab = b - a;
    P center = a + P(ab.real()/2,ab.imag()/2);
    P un1 = (ab * P(0, +1)) / abs(ab);
    P un2 = (ab * P(0, -1)) / abs(ab);
    double dist = sqrt(1 - (abs(ab)/2)*(abs(ab)/2));
    P c1 = center + un1 * dist;
    P c2 = center + un2 * dist;

    res.push_back(c1);
    res.push_back(c2);
  }

  return res;
}

int main(void){
  int n;

  while(cin>>n,n){
    P p[n];
    for(int i=0;i<n;i++){
      double x,y;
      char ch;
      cin>>x>>ch>>y;
      p[i] = P(x,y);
    }

    int ans = 1;
    for(int i=0;i<n;i++){
      for(int j=i+1;j<n;j++){
        vector<P> v = cross(p[i],p[j]);
        if(v.empty()) continue;
        int countA = 2;
        int countB = 2;
        for(int k=0;k<n;k++){
          if(i == k || j == k) continue;
          if(abs(v[0]-p[k]) - 1.0 < EPS) countA++;
          if(v.size() == 2 && abs(v[1]-p[k]) - 1.0 < EPS) countB++;
        }
        ans = max(ans,max(countA,countB));
      }
    }
    cout<<ans<<endl;
  }

  return 0;
}