import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static LinkedList<Integer>[] arrList = new LinkedList[1001];
static int[] dfn = new int[1001];
static int[] low = new int[1001];
static boolean[] vis = new boolean[1001];
static int order;
static Set<Integer> resultSet = new TreeSet<Integer>();
static int[] subnets = new int[1001];
static int root;//根节点,随便找图中一个为根节点
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String str;
int c = 0;
while (true){
str = bufferedReader.readLine();
if ("0".equals(str)){
break;
}
while (true){
StringTokenizer st = new StringTokenizer(str);
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (arrList[a] == null){
arrList[a] = new LinkedList<Integer>();
}
if (arrList[b] == null){
arrList[b] = new LinkedList<Integer>();
}
arrList[a].add(b);
arrList[b].add(a);
root = a;
str = bufferedReader.readLine();
if ("0".equals(str)){
bufferedReader.readLine();
break;
}
}
order = 0;
dfs(root,root);
c++;
System.out.println("Network #"+c);
//求去点割点后联通量
if(resultSet.size() == 0){
System.out.println(" No SPF nodes");
} else {
for (int i=0;i<subnets.length;i++){
if (subnets[i] > 0){
System.out.println(" SPF node "+i+" leaves "+(subnets[i]+1)+" subnets");
}
}
}
System.out.println("");
Arrays.fill(arrList,null);
Arrays.fill(dfn,0);
Arrays.fill(low,0);
Arrays.fill(vis,false);
Arrays.fill(subnets,0);
resultSet.clear();
}
bufferedReader.close();
}
//求割点
static void dfs(int u,int parent){
int child = 0;
vis[u] = true;
dfn[u] = low[u] = order++;
for (int i=0;i<arrList[u].size();i++){
int v = arrList[u].get(i);
if (vis[v]){
if (v != parent){
low[u] = Math.min(low[u],dfn[v]);
}
} else {
child++;
dfs(v,u);
low[u] = Math.min(low[u],low[v]);
if ((u == root && child>1) || (u != root && low[v] >= dfn[u])){
resultSet.add(u);
subnets[u]++;//记录u点对应的子网数
}
}
}
}
}