/*
TASK: TRIP
LANG: C++
*/

#include <stdio.h>
#define max(a,b) ((a)>(b)?(a):(b))

const int MAX_N = 1005;

int n, m, k;
int A[MAX_N][MAX_N];  // matrica na sysedstvo
int V[MAX_N];         // dali i-tiq vruh e pose6tavan predi

int ans = -1;

void input ()
{
   int i, a, b;

   scanf ("%d%d%d", &n, &m, &k);

   for (i=1; i<=m; i++) {
      scanf ("%d%d", &a, &b);
      A[a][b] = A[b][a] = 1;
   }

   for (i=1; i<=k; i++) {
      scanf ("%d", &a);
      V[a] = 1;
   }
}

// O(n^3)
void remove ()
{
   int i, j, q;

   // za chii sysedi
   for (i=1; i<=n; i++)
      if (V[i])
         // 1-vo rebro
         for (j=1; j<=n; j++)
            if (A[i][j]) {
               // 2-ro rebro
               for (q=1; q<=n; q++)
                  if (A[i][q]) {
                     A[j][q] = A[q][j] = 1;
                     A[i][q] = A[q][i] = 0;
                  }
               
            A[i][j] = A[j][i] = 0;
         }
}

void solve (int vert)
{
   int Q[MAX_N], f=0, l=1;
   int used[MAX_N];
   int p, i;

   for (i=1; i<=n; i++) used[i]=0;

   Q[0] = vert;
   used[vert] = 1;

   // BFS - O(n^2)
   while (f<l) {
      int p = Q[f++];
      
      for (i=1; i<=n; i++)
         if (A[p][i] && !used[i]) {
               Q[l++] = i;
               used[i] = used[p]+1;
               ans = max(ans, used[i]);
         }
   }
}

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

   int i;

   input ();
   remove ();

   // for all
   for (i=1; i<=n; i++)
      solve (i);
      
   printf ("%d\n", ans);

   return 0;
}

