#include <iostream>
#include <complex>
#include <vector>
#include <algorithm>

using namespace std;

#define EPS (1e-5)

typedef complex<double> P;

vector<P> crossPoint(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 - 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;
}

void solve()
{
	int n;
	while (cin >> n, n)
	{
		vector<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 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;
	}
}
int main(void)
{
	solve();
	return 0;
}