#include "crocodile.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
template<class X, class Y> bool maximize (X &x, const Y &y) {return x < y ? x = y, 1 : 0;}
template<class X, class Y> bool minimize (X &x, const Y &y) {return x > y ? x = y, 1 : 0;}
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
int dist[maxn][2];
vector<pair<int, int>> adj[maxn];
int travel_plan(int N, int M, int R[][2], int L[], int K, int P[]) {
for (int i = 0; i < M; ++i) {
adj[R[i][0]].pb({R[i][1], L[i]});
adj[R[i][1]].pb({R[i][0], L[i]});
}
priority_queue<pair<int, int>> pq;
memset(dist, -1, sizeof dist);
for (int i = 0; i < K; ++i) {
pq.push({0, P[i]});
dist[P[i]][0] = dist[P[i]][1] = 0;
}
while (!pq.empty()) {
int d = -pq.top().fi, u = pq.top().se;
// cout << '(' << d << ", " << u << ')' << ": " << dist[u][1] << '\n';
pq.pop();
if (d != dist[u][1]) continue;
for (auto v : adj[u]) {
if (dist[v.fi][0] == -1 || dist[v.fi][0] > d + v.se) {
dist[v.fi][1] = dist[v.fi][0];
dist[v.fi][0] = d + v.se;
if (dist[v.fi][1] != -1) pq.push({-dist[v.fi][1], v.fi});
}
else if (dist[v.fi][1] == -1 || dist[v.fi][1] > d + v.se) {
dist[v.fi][1] = d + v.se;
pq.push({-dist[v.fi][1], v.fi});
}
}
}
return dist[0][1];
}
//int main() {
// int r[][2] = {{0, 2}, {0, 3}, {3, 2}, {2, 1}, {0, 1}, {0, 4}, {3, 4}};
// int l[] = {4, 3, 2, 10, 100, 7, 9};
// int p[] = {1, 3};
// cout << travel_plan(5, 7, r, l, 2, p);
//}