#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int n;
class graph {
private:
int idx;
public:
int head[N + 5];
struct edge {
int to, nxt;
} e[N * (N - 1) + 5];
void init(int n) {
memset(head, 0, n + 1 << 2);
idx = 0;
}
void add_dir(int u, int v) {
e[++idx] = {v, head[u]};
head[u] = idx;
}
void add_udir(int u, int v) {
add_dir(u, v), add_dir(v, u);
}
} g;
int dfn[N + 5], low[N + 5], timestamp;
bool is_cut[N + 5];
void init() {
g.init(n);
memset(dfn, 0, n + 1 << 2);
memset(is_cut, 0, n + 1);
}
void tarjan(int u, int root) {
dfn[u] = low[u] = ++timestamp;
int cnt = 0;
for (int i = g.head[u]; i; i = g.e[i].nxt) {
int v = g.e[i].to;
if (!dfn[v]) {
tarjan(v, root);
low[u] = min(low[u], low[v]);
if (low[v] >= dfn[u]) {
cnt++;
if (u != root || cnt >= 2)
is_cut[u] = true;
}
} else
low[u] = min(low[u], dfn[v]);
}
}
int main() {
while (true) {
scanf("%d", &n);
if (n == 0)
break;
init();
while (true) {
int u, v;
char ch;
scanf("%d%c", &u, &ch);
if (u == 0)
break;
while (ch != '\n') {
scanf("%d%c", &v, &ch);
g.add_udir(u, v);
}
}
for (int u = 1; u <= n; u++)
if (!dfn[u])
tarjan(u, u);
int ans = 0;
for (int u = 1; u <= n; u++)
ans += is_cut[u];
printf("%d\n", ans);
}
return 0;
}