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

#include <stdio.h>
#define MAX 1005

typedef struct {
        int a[MAX];
        int front;
        int rear;
        int empty;
} queue;

int init (queue *q) {
    q -> front = q -> rear = 0;
    q -> empty = 1;
}

int push (queue *q, int x) {
    if (q -> front == q -> rear && !q -> empty) return -1;
    q -> a[q -> front ++] = x;
    if (q -> front == MAX) q -> front = 0;
    q -> empty = 0;
    return 0;
}

int pop (queue *q) {
    int x;
    if (q -> front == q -> rear && q -> empty) return -1;
    x = q -> a[q -> rear ++];
    if (q -> rear == MAX) q -> rear = 0;
    if (q -> rear == q -> front) q -> empty = 1;
    return x;
}

int g[MAX][MAX];
int u[MAX];
int used[MAX];
int dist[MAX];
int visit[MAX];
int n;
queue q;

int main () {
    int n, m, k;
    int p, d, f = 0;
    int s;
    int i, x;
    init (&q);
    scanf ("%d%d%d", &n, &m, &k);
    for (i = 0; i < m; i ++) {
        scanf ("%d%d", &p, &d);
        g[p][d] = g[d][p] = 1;
    }
    for (i = 0; i < k; i ++) {
        scanf ("%d", &p);
        u[p] = 1;
    }
    for (i = 1; i <= n; i ++) {
        if (u[i] != 1) break;
    }
    s = i;
    for (i = 1; i <= n; i ++) {
        if (u[i]) u[i] = 0;
        else u[i] = 1;
        if (i != s) dist[i] = 1024;
    }
    visit[s] = u[s];
    dist[s] = 0;
    push (&q, s);
    used[s] = 1;
    for (;;) {
        x = pop(&q);
        if (x == -1) break;
        for (i = 1; i <= n; i ++) {
            if (g[x][i]) {
               if (visit[i] < visit[x] + u[i] && dist[i] >= dist[x] + 1) {
                  visit[i] = visit[x] + u[i];
                  dist[i] = dist[x] + 1;
                  g[i][x] = 0;
               }
               if (!used[i]) {
                  push (&q, i);
                  used[i] = 1;
               }
            }
        }
    }
    p = 0;
    for (i = 1; i <= n; i ++) {
        if (visit[i] > p) p = visit[i];
    }
    printf ("%d\n", p);
    return 0;
}
