11709

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <queue>
#include <string.h>
#include <stdio.h>

using namespace std;

vector<int> graph[1005];
bool visit[1005];
bool visited[1005][1005];
map<string,int> mp;
int p,t;

void dfs(int u,int v)
{
	visited[u][v]=1;
	int tmp;
	for(int i=0;i<graph[v].size();i++)
	{
		tmp=graph[v][i];
		if(!visited[u][tmp])
		{
			dfs(u,tmp);
		}
	}
}


int main()
{
	string s,s1;

	while(cin>>p>>t)
	{
		if(p==0 && t==0)
		break;
		mp.clear();
		getchar();



		for(int i=0;i<p;i++)
		{
			getline(cin,s);
			mp[s]=i;
			graph[i].clear();
		}

		for(int i=0;i<t;i++)
		{
			getline(cin,s);
			getline(cin,s1);
			graph[mp[s]].push_back(mp[s1]);

		}
		memset(visited,0,sizeof(visited));

		for(int i=0;i<p;i++)
			dfs(i,i);

		memset(visit,0,sizeof(visit));
		int cnt=0;
		for(int i=0;i<p;i++)
		{
			if(!visit[i])
			{
				cnt++;
				for(int j=i+1;j<p;j++)
				{
					if(!visit[j] && visited[i][j] && visited[j][i])
					{
						visit[j]=1;
					}
				}
			}
		}
		cout<<cnt<<"\n";
	}

	return 0;

}

 

Leave a Reply

Your email address will not be published. Required fields are marked *