#include <bits/stdc++.h>
using namespace std;
inline int QRead() {
  int acur = 0;
  char ch = getchar();
  while ('0' > ch || ch > '9') ch = getchar();
  while ('0' <= ch && ch <= '9')
    acur = (acur << 3) + (acur << 1) + ch - '0', ch = getchar();
  return acur;
}
const int NTEM = 200, NPNT = 600;
struct EDGE {
  int to, val;
};
vector<EDGE> lnk[NTEM + NPNT + 3];
int frm[NTEM + 3], dis[NPNT + 3][NPNT + 3], vis[NTEM + NPNT + 3],
    mat[NTEM + NPNT + 3];
int npnt, nedg, ntem, nreq, maxdis, lim, vistag;
bool DFS(int u) {
  vis[u] = vistag;
  for (auto it : lnk[u]) {
    int val = it.val, v = it.to;
    if (vis[v] == vistag || val > lim) continue;
    vis[v] = vistag;
    if (!mat[v] || DFS(mat[v])) {
      mat[u] = v;
      mat[v] = u;
      return true;
    }
  }
  return false;
}
bool Match(int mid) {
  lim = mid;
  int cur = 0;
  memset(mat, 0, sizeof mat);
  for (int i = 1; i <= ntem; i++)
    if (!mat[i]) {
      vistag++;
      cur += DFS(i);
    }
  return cur >= nreq;
}
void AddEdge(int u, int v, int val) {
  lnk[u].push_back((EDGE){v, val});
  lnk[v].push_back((EDGE){u, val});
}
int BinarySearch() {
  int Lef = 0, Rig = maxdis + 1;
  while (Lef + 1 < Rig) {
    int Mid = (Lef + Rig) >> 1;
    if (Match(Mid))
      Rig = Mid;
    else
      Lef = Mid;
  }
  return Rig;
}
int main() {
  memset(dis, 0x3f, sizeof dis);
  int inf = dis[0][0];
  npnt = QRead();
  nedg = QRead();
  ntem = QRead();
  nreq = QRead();
  for (int i = 1; i <= ntem; i++) frm[i] = QRead();
  for (int i = 1; i <= nedg; i++) {
    int u, v, far;
    u = QRead();
    v = QRead();
    far = QRead();
    dis[u][v] = dis[v][u] = min(dis[u][v], far);
  }
  for (int i = 1; i <= npnt; i++) dis[i][i] = 0;
  for (int k = 1; k <= npnt; k++)
    for (int i = 1; i <= npnt; i++)
      for (int j = 1; j <= npnt; j++) {
        if (i == k || j == k || i == j) continue;
        if (dis[i][k] == inf || dis[k][j] == inf) continue;
        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
      }
  for (int i = 1; i <= npnt; i++)
    for (int j = 1; j <= npnt; j++)
      if (dis[i][j] != inf) maxdis = max(maxdis, dis[i][j]);
  for (int i = 1; i <= ntem; i++)
    for (int j = 1; j <= npnt; j++) AddEdge(i, j + ntem, dis[frm[i]][j]);
  if (Match(0)) {
    printf("%d\n", 0);
    return 0;
  }
  int res = BinarySearch();
  if (res <= maxdis && Match(res))
    printf("%d\n", res);
  else
    printf("-1\n");
  return 0;
}
