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

using namespace std;

typedef complex<double> P;
#define EPS (1e-10)
#define EQ(a,b) (abs(a-b)<EPS)

bool used[1000];
int n;
vector<P> v;

bool Cross(P a,P b){
	double dis = abs(a-b);
	return (EQ(dis,2)||dis<2.0);
}


// sツづ重ツづ按づづつ「ツづゥツ円ツづーツつキツづ猟づ仰づ淞、ツつサツづェツづァツづ個円ツづ可妥篠つオツづ催帰ツづーツ行ツつ、
int dfs(int s){
	if(used[s])
		return 0;
	used[s]=true;
	int maxCnt=0;
	for(int i = 0; i < v.size(); i++){
		if(!used[i]){
			// ツ重ツづ按づづつ「ツつスツづァ
			if(Cross(v[s],v[i]))
				maxCnt=max(maxCnt,dfs(i)+1);
		}
	}
	return maxCnt;
}

int main(){

	while(cin>>n&&n!=0){
		double x,y;
		for(int i = 0; i < n; i++){
			char cm;
			cin>>x>>cm>>y;
			v.push_back(P(x,y));
		}
		fill(used,used+1000,false);
		int maxCnt=1;
		for(int i = 0; i < v.size(); i++){
			if(!used[i]){
				maxCnt=max(dfs(i)+1,maxCnt);
			}
		}
		v.clear();
		cout<<maxCnt<<endl;
	}

	return 0;
}