/*
TASK:trip
LANG:C++
*/

#include <cstdio>
#include <vector>
using namespace std;

int n,m,k;
vector < vector <int> > a;
int poseteni[1024];

int stack[1024][2];
int used[1024];
int sTop;
int obr[2];

int bfs(int u)
{
    for ( int i = 0 ; i < 1024 ; i++ ) used[i] = 0;

    used[u] = 1;
    stack[0][0] = u;
    stack[0][1] = obr[poseteni[u]];
    int p1 = 0 , p2 = 1;

    int max = -1;

    sTop = 1;
    while(p1!=p2)
    {
//       printf("level\n");
    	for ( int i = p1 ; i < p2 ; i++ )
        	for ( unsigned j = 0 ; j < a[stack[i][0]].size() ; j++ )
            	if ( !used[a[stack[i][0]][j]] )
                {
                    used[a[stack[i][0]][j]] = 1;
                	stack[sTop][0] = a[stack[i][0]][j];
    				stack[sTop][1] = stack[i][1] + obr[poseteni[a[stack[i][0]][j]]];
                    if ( stack[sTop][1] > max ) max = stack[sTop][1];
//                	printf("added %d %d\n",stack[sTop][0]+1,stack[sTop][1]);
                    sTop++;
                }
    	p1 = p2;
        p2 = sTop;
    }
    return max;
}


int main()
{
	obr[0] = 1;
    obr[1] = 0;

//	freopen("trip.in","r",stdin);

    scanf("%d%d%d",&n,&m,&k);
    a.resize(n);
    for ( int i = 0 ; i < m ; i++ )
    {
    	int t1,t2;
		scanf("%d%d",&t1,&t2);
        a[t1-1].push_back(t2-1);
        a[t2-1].push_back(t1-1);
    }
    for ( int i = 0 ; i < k ; i++ )
    {
    	int t1;
    	scanf("%d",&t1);
		poseteni[t1-1] = 1;
    }
    /*
	for ( int i = 0 ; i < 10 ; i++ )
    	printf("%d ",poseteni[i]);
    printf("\n");
    */
/*
    for  ( int i = 0 ; i < n ; i++ )
    {
    	printf("%d : ",i+1);
        for ( int j = 0 ; j < a[i].size() ; j++ )
        	printf("%d ",a[i][j]+1);
        printf("\n");
    }
  */

    
    int max = -1;

    for ( int i = 0 ; i < n ; i++ )
    {
//    	printf("BFS(%d): ",i+1);
    	int k = bfs(i);
        if ( k > max ) max = k;
//        printf("%d\n",k);
//        scanf("%d",&k);
    }

    printf("%d\n",max);
    return 0;
}
