#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <map>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
int n,m;
char name1[30],name2[30];
map<string, int> stoiMap;
map<int, string> itosMap;
//表示i到j是否可达
bool d[30][30];
bool vis[30];
vector<int> ans;
void dfs(int i)
{
vis[i]=true;
ans.push_back(i);
for (int j=0; j<n; j++)
if (!vis[j]&&d[i][j])
dfs(j);
}
int main()
{
int _case=0;
while (scanf("%d %d",&n,&m)!=EOF&&n!=0&&m!=0)
{
printf("Calling circles for data set %d:\n",++_case);
stoiMap.clear();
itosMap.clear();
int i=0;
memset(d, false, sizeof(d));
memset(vis, false, sizeof(vis));
while (m-->0)
{
scanf("%s %s",name1,name2);
string n1(name1);
string n2(name2);
//将人名和序号建立双向映射
if (stoiMap.find(n1)==stoiMap.end())
{
stoiMap[n1]=i;
itosMap[i]=n1;
i++;
}
if (stoiMap.find(n2)==stoiMap.end())
{
stoiMap[n2]=i;
itosMap[i]=n2;
i++;
}
d[stoiMap[n1]][stoiMap[n2]]=true;
}
//floyd求闭包
for (int k=0; k<n;k++)
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
d[i][j]=d[i][j]||(d[i][k]&&d[k][j]);//传递闭包
//构建新的图d
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
if (!(d[i][j]&&d[j][i]))//如果不能相互到达
d[i][j]=d[j][i]=false;
//dfs求连通分量
for (int i=0; i<n; i++)
{
ans.clear();
if (!vis[i])
dfs(i);
for (int j=0; j<ans.size(); j++)
{
printf("%s",itosMap[ans[j]].c_str());
if (j<ans.size()-1)
printf(", ");
else
printf("\n");
}
}
//printf("\n");
}
return 0;
}