#include <bits/stdc++.h>
using namespace std;
const int N = 1000 + 10, M = 3e5 + 10, inf = 0x3f3f3f3f;
int n, m, v, e, cnt, s, t, l, r, ans = -1, p[N], dis[N][N], head[N], now[N],
                                 dep[N], b[N];
struct Edge {
  int nxt;
  int to;
  int flow;
};
Edge edge[M << 1];
inline void add_edge(int u, int v, int c) {
  edge[cnt] = (Edge){head[u], v, c};
  head[u] = cnt++;
  edge[cnt] = (Edge){head[v], u, 0};
  head[v] = cnt++;
}
inline void build(int k) {
  cnt = 0;
  memset(head, -1, sizeof(head));
  for (int i = (1), iend = (v); i <= iend; i++)
    for (int j = (1), jend = (n); j <= jend; j++)
      if (dis[p[i]][j] <= k) add_edge(i, j + v, 1);
  for (int i = (1), iend = (v); i <= iend; i++) add_edge(s, i, 1);
  for (int i = (1), iend = (n); i <= iend; i++) add_edge(i + v, t, 1);
}
inline int bfs() {
  memset(dep, 0, sizeof(dep));
  memcpy(now, head, sizeof(now));
  queue<int> q;
  q.push(s);
  dep[s] = 1;
  while (q.size()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; ~i; i = edge[i].nxt) {
      int v = edge[i].to;
      if (!dep[v] && edge[i].flow) {
        dep[v] = dep[u] + 1;
        q.push(v);
        if (v == t) return 1;
      }
    }
  }
  return 0;
}
int dfs(int u, int sum) {
  if (u == t) return sum;
  int rest = sum;
  for (int &i = now[u]; ~i; i = edge[i].nxt) {
    int v = edge[i].to, k;
    if (dep[v] == dep[u] + 1 && edge[i].flow &&
        (k = dfs(v, min(rest, edge[i].flow)))) {
      edge[i].flow -= k;
      edge[i ^ 1].flow += k;
      rest -= k;
      if (!rest) break;
    }
  }
  return sum - rest;
}
int dinic() {
  int res = 0;
  while (bfs()) res += dfs(s, inf);
  return res;
}
int main() {
  int qwq = 0;
  memset(dis, inf, sizeof(dis));
  scanf("%d%d%d%d", &n, &m, &v, &e);
  s = 0;
  t = n + v + 1;
  for (int i = (1), iend = (v); i <= iend; i++) {
    scanf("%d", &p[i]);
    if (!b[p[i]]) qwq++, b[p[i]] = 1;
  }
  if (qwq >= e) {
    printf("0");
    return 0;
  }
  for (int i = (1), iend = (m); i <= iend; i++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    dis[x][y] = dis[y][x] = min(dis[x][y], z);
  }
  for (int i = (1), iend = (n); i <= iend; i++) dis[i][i] = 0;
  for (int k = (1), kend = (n); k <= kend; k++)
    for (int i = (1), iend = (n); i <= iend; i++)
      for (int j = (1), jend = (n); j <= jend; j++)
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  l = 1, r = 1731311;
  while (l < r) {
    int mid = (l + r) >> 1;
    build(mid);
    if (dinic() >= e) {
      ans = mid;
      r = mid;
    } else
      l = mid + 1;
  }
  printf("%d", ans);
  return 0;
}
