#include <bits/stdc++.h>
using namespace std;
vector<complex<double> > crossPoint(complex<double> a, complex<double> b) {
  vector<complex<double> > res;
  complex<double> ob = a + b;
  if (abs(b - a) > 2.0)
    return res;
  else if (abs(abs(b - a) - 2.0) < (1e-10))
    res.push_back(complex<double>(ob.real() / 2, ob.imag() / 2));
  else {
    complex<double> ab = b - a;
    complex<double> center = a + complex<double>(ab.real() / 2, ab.imag() / 2);
    complex<double> un1 = (ab * complex<double>(0, +1)) / abs(ab);
    complex<double> un2 = (ab * complex<double>(0, -1)) / abs(ab);
    double dist = sqrt(1 - pow(abs(ab) / 2, 2));
    complex<double> c1 = center + un1 * dist;
    complex<double> c2 = center + un2 * dist;
    res.push_back(c1);
    res.push_back(c2);
  }
  return res;
}
int main(void) {
  int n;
  while (cin >> n, n) {
    complex<double> p[n];
    for (int i = 0; i < n; i++) {
      double x, y;
      char ch;
      cin >> x >> ch >> y;
      p[i] = complex<double>(x, y);
    }
    int ans = 1;
    for (int i = 0; i < n; i++) {
      for (int j = i + 1; j < n; j++) {
        vector<complex<double> > 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 < (1e-10) ||
              v.size() == 2 && abs(v[1] - p[k]) - 1.0 < (1e-10))
            count++;
        }
        ans = max(ans, count);
      }
    }
    cout << ans << endl;
  }
  return 0;
}
