class UnionFind {
public:
UnionFind(int sz) : root(sz), rank(sz) {
for (int i = 0; i < sz; i++) {
root[i] = i;
rank[i] = 1;
}
}
int find(int x) {
while (x != root[x]) {
x = root[x];
}
return x;
}
void unionSet(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
if (rank[rootX] > rank[rootY]) {
root[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
root[rootX] = rootY;
} else {
root[rootY] = rootX;
rank[rootX] += 1;
}
}
}
bool connected(int x, int y) {
return find(x) == find(y);
}
private:
vector<int> root;
vector<int> rank;
};
int main() {
char c;
int i,j=1;
int n=2005,ans=0;
int province[2005]={0};
UnionFind city(n);
while (cin>>c) if (c=='[') break;
do{
i=0;
while (cin>>c){
if (c==']') break;
if (c=='1'){
i++;
city.unionSet(i,j);
}
else if (c=='0') i++;
}
j++;n=i;
}while(j<n);
for (int i=1;i<=n;i++){
if (!province[city.find(i)]){
ans++;
province[city.find(i)]=1;
}
}
cout<<ans;
return 0;
}
