#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define mp push_back
int n;
const int MAXN = 110;
struct Edge
{
int v,next;
}edge[MAXN*MAXN];
int H[MAXN];
int len;
int cut[MAXN];
int low[MAXN];
int vis[MAXN];
int times;
int root;
void addedge(int u,int v)
{
edge[len].v = v;
edge[len].next = H[u];
H[u] = len ++;
}
int dfs(int st,int fa)
{
vis[st] = low[st] = ++ times;
int child = 0;
for(int ei=H[st];ei!=-1;ei=edge[ei].next)
{
int v = edge[ei].v;
if(v == st) continue; //not effect
if(vis[v] == 0)
{
child ++;
dfs(v,st);
low[st] = min(low[st],low[v]);
if(st == root && child >=2) cut[st] = 1;
if(st != root && low[v] >= vis[st]) cut[st] = 1;
}
else
{
low[st] = min(low[st],vis[v]);
}
}
}
int main()
{
int n;
int u,v;
char ch;
while(scanf("%d",&n),n)
{
memset(H,-1,sizeof(H));
memset(cut,0,sizeof(cut));
memset(vis,0,sizeof(vis));
times = 0;
len = 0;
while(scanf("%d",&u),u)
{
while(getchar() != '\n')
{
scanf("%d",&v);
addedge(u,v);
addedge(v,u);
}
}
root = 1;
dfs(1,-1);
int ret = 0;
for(int i=1;i<=n;i++)
{
if(cut[i]) ret ++;
}
printf("%d\n",ret);
}
return 0;
}