There are N towns in JOI, which are connected by M bidirectional roads. There are shopping malls in K towns, and the people go to one of those towns through the road to shop.

Depending on the location of your home, you may have to travel long distances to go shopping, which is very inconvenient. To understand this situation, the King decided to investigate how the shortest distance to the town where the shopping mall is located can be longer depending on the location of the house. This survey is very difficult because the house may be built in the middle of the road (see the explanation in Input Example 1). So the King asked you, a good programmer, to create a program to do the research.



input

Read the following input from standard input.

* The integers N, M, and K are written on the first line, separated by blanks. N represents the number of towns in JOI country, M represents the number of roads in JOI country, and i> K represents the number of towns with shopping malls. The towns are numbered 1, 2, ..., N.
* The following M line represents road information. The integers ai, bi, li (1 ≤ ai ≤ N, 1 ≤ bi ≤ N, 1 ≤ li ≤ 1000) are written on the first line (1 ≤ i ≤ M), separated by blanks. This means that the i-th road connects the town ai and the town bi and is li in length. Both ends of the road are never the same town. Also, for any two towns p and q, there are no more than two roads connecting p and q. You can follow several roads from any town to any town.
* The following K line represents shopping mall information. One integer si (1 ≤ si ≤ N) is written on the i + M + 1 line (1 ≤ i ≤ K). This means that there is a shopping mall in the town si. The same value does not appear more than once in s1, ..., sK.

output

To the standard output, output one integer rounded to the nearest whole number of the shortest distance to the town where the shopping mall is located.

Example

Input

3 3 1
1 2 1
2 3 1
3 1 1
1


Output

2
#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>Q;
int n, m, k, a[100000], b[100000], c[100000], r[10000], dist[10000];
vector<pair<int, int>>x[10000];
void dijkstra() {
	for (int i = 1; i <= n; i++) dist[i] = 999999999;
	for (int i = 0; i < k; i++) { dist[r[i]] = 0; Q.push(make_pair(0, r[i])); }
	while (!Q.empty()) {
		int a1 = Q.top().first, a2 = Q.top().second; Q.pop();
		for (int i = 0; i < x[a2].size(); i++) {
			if (dist[x[a2][i].first] > a1 + x[a2][i].second) {
				dist[x[a2][i].first] = a1 + x[a2][i].second;
				Q.push(make_pair(dist[x[a2][i].first], x[a2][i].first));
			}
		}
	}
}
int main() {
	cin >> n >> m >> k;
	for (int i = 0; i < m; i++) {
		cin >> a[i] >> b[i] >> c[i]; 
		x[a[i]].push_back(make_pair(b[i], c[i]));
		x[b[i]].push_back(make_pair(a[i], c[i]));
	}
	for (int i = 0; i < k; i++)cin >> r[i];
	dijkstra();
	int maxn = 0;
	for (int i = 0; i < m; i++) {
		int R1 = min(dist[a[i]], dist[b[i]]);
		int R2 = (c[i] + abs(dist[a[i]] - dist[b[i]]) + 1) / 2;
		maxn = max(maxn, R1 + R2);
	}
	cout << maxn << endl;
	return 0;
}