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

#define EPS (1e-10)

typedef complex<double> P;

vector<P> crossPoint(P a,P b){
	vector<P> res;
	P ob = a + b;

	if(abs(b-a) > 2.0)
		return res;
	else if(abs(abs(b-a) - 2.0) < EPS)
		res.push_back( P(ob.real()/2,ob.imag()/2) );
	else{
		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 - pow(abs(ab) / 2, 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 = crossPoint(p[i],p[j]);
				if(v.empty()) continue;
				int count = 2;
				for(int k=0;k<n;k++){
					if(i == k || j == k) continue;
					if(abs(v[0]-p[k]) - 1.0 < EPS ||
						 v.size() == 2 && abs(v[1]-p[k]) - 1.0 < EPS) count++;
				}

				ans = max(ans,count);
			}
		}

		cout<<ans<<endl;
	}

	return 0;
}