#include <bits/stdc++.h>
using namespace std;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int n;
int ans;
double x[128], y[128];
bool D[128][128];
vector<int> ok;
void init() {
  ans = 0;
  fill(x, x + n, 0);
  fill(y, y + n, 0);
  memset(D, false, sizeof(D));
}
double dis(int a, int b) {
  double ans = 0;
  ans = sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
  return ans;
}
void mkpair() {
  for (int i = 0; i < (n); i++) {
    for (int j = i + 1; j < (n); j++) {
      if (dis(i, j) <= 2.0) {
        D[i][j] = D[j][i] = true;
      }
    }
  }
}
int main() {
  while (scanf("%d", &n), n) {
    init();
    for (int i = 0; i < (n); i++) {
      scanf("%lf,%lf", &x[i], &y[i]);
    }
    mkpair();
    int cnt = 0;
    vector<int> f;
    vector<int> s;
    for (int i = 0; i < (n); i++) {
      cnt = 0;
      for (int j = i + 1; j < (n); j++) {
        if (D[i][j]) {
          ++cnt;
          ans = 1;
          f.push_back(i);
          s.push_back(j);
        }
      }
    }
    queue<int> Q;
    vector<int> vi;
    for (int i = 0; i < (n); i++) {
      for (int j = i + 1; j < (n); j++) {
        if (D[i][j]) {
          Q.push(j);
        }
      }
      if (Q.size() == 0) continue;
      if (Q.size() == 1) {
        ans = max(ans, 2);
        Q.pop();
      } else {
        vi.push_back(Q.front());
        Q.pop();
        while (Q.size()) {
          int q = Q.front();
          Q.pop();
          int len = vi.size();
          bool f = true;
          for (int i = 0; i < (len); i++) {
            if (!D[vi[i]][q]) {
              f = false;
              break;
            }
          }
          if (f) vi.push_back(q);
        }
        int g = vi.size();
        ans = max(ans, g + 1);
        vi.clear();
      }
    }
    printf("%d\n", ans);
  }
  return 0;
}
