// Soratam topologic nodurile , apoi facem suma mex in O(N+M).

#include <fstream>
#include <vector>
#include <queue>
using namespace std;

const int Nmax = 1011;
const int Mmax = 5011;
const int oo = 1<<30;

int N,M,P,Sum;
vector< int > Leg[Nmax],T[Nmax];
queue< int > Q,Rez;
int Mex[Nmax],Grad[Nmax],Grady[Nmax];
bool Used[Nmax];

ifstream F("SG.in");
ofstream G("SG.out");

void Sort()
{
	for ( int i=1;i<=N;++i )
		if ( !Grad[i] )
			Q.push( i );
	
	while ( Q.size() )
	{
		int Nod=Q.front();
		Q.pop();
		
		for ( vector<int>::iterator it=T[ Nod ].begin(); it!=T[ Nod ].end() ; ++it )
			if ( Grad[ *it ] )
			{
				--Grad[ *it ];
				if ( ! Grad[ *it ] )
					Q.push( *it );
			}
		
		Rez.push( Nod );
	}
}

int main()
{
	F>>N>>M>>P;
	for (int i=1;i<=M;++i)
	{
		int x,y;
		F>>x>>y;
		Leg[x].push_back( y );
		T[y].push_back( x );
		++Grad[x];
		++Grady[x];
	}
	
	Sort();
	
	for (int i=1;i<=N;++i)
		Mex[i]=oo,Grad[i]=Grady[i];
	
	while ( Rez.size() )
	{
		int Nod=Rez.front();
		Rez.pop();
		
		if ( Grad[Nod]!=0 )
		{
			for (int i=0;i<int(Leg[Nod].size() );++i)
				Used[ Mex[ Leg[Nod][i] ] ]=1;
			
			int i; for (i=0; Used[i] ;++i);
			Mex[Nod]=i;
			
			for (int i=0;i<int(Leg[Nod].size() );++i)
				Used[ Mex[ Leg[Nod][i] ] ]=0;
		}
		else
			Mex[Nod]=0;
	}
	
	--P;
	F>>Sum;
	Sum=Mex[Sum];
	
	for (int Nod;P;--P)
	{
		F>>Nod;
		Sum^=Mex[Nod];
	}
	
	G<<(Sum!=0)<<'\n';
}
