#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
const int K = (1 << 17) + 5;
const int M = 22;
int n, m, k, x, y, c[M], dis[N][M], dp[M][K], ans = LONG_LONG_MAX;
bool vis[N];
struct Node{
int v, w;
bool operator < (const Node &a) const{
return w > a.w;
}
};
vector<Node> G[N];
map<int, int> mp;
void dijkstra (int x, int mid){
for (int i = 1; i <= 100000; ++i){
vis[i] = 0;
dis[i][mid] = 0x3f3f3f3f3f3f3f3f;
}
dis[x][mid] = 0;
priority_queue<Node> q;
q.push(Node{x, 0});
while (!q.empty()){
int tmp = q.top().v;
q.pop();
if (vis[tmp]) continue;
vis[tmp] = 1;
for (int i = 0; i < G[tmp].size(); ++i){
int x = G[tmp][i].v, y = G[tmp][i].w;
if (dis[x][mid] > dis[tmp][mid] + y){
dis[x][mid] = dis[tmp][mid] + y;
q.push(Node{x, dis[x][mid]});
}
}
}
}
signed main (){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; ++i){
cin >> x >> y;
G[x].push_back(Node{y, 1});
G[y].push_back(Node{x, 1});
}
cin >> k;
for (int i = 1; i <= k; ++i){
cin >> c[i];
dijkstra(c[i], i);
}
memset(dp, 0x3f, sizeof(dp));
for (int i = 1; i <= k; ++i) dp[i][(1 << (k - i))] = 1;
for (int i = 1; i <= k; ++i){
for (int len = 2; len <= k; ++len){
for (int j = 1; j <= (1 << k) - 1; ++j){
int pos = j, tmp = 0, lena = 0, lenb = 0;
vector<int> vec;
while (pos > 0){
if (pos % 2) lenb += 1;
vec.push_back(pos % 2);
pos /= 2;
lena += 1;
}
vec.push_back(0);
if (lenb != len) continue;
lena += 1;
reverse(vec.begin(), vec.end());
if (vec[i] == 0) continue;
tmp = j - (1ll << (lena - i - 1));
for (int l = 1; l <= k; ++l){
if (l == i || vec[l] == 0 || dis[c[i]][l] > 1e18) continue;
dp[i][j] = min(dp[i][j], dp[l][tmp] + dis[c[i]][l]);
}
}
}
}
for (int i = 1; i <= k; ++i) ans = min(ans, dp[i][(1 << k) - 1]);
cout << ((ans > 1e18) ? -1 : ans) << '\n';
return 0;
}