#include <bits/stdc++.h>
using namespace std;
struct kuhn {
  int n, m;
  vector<bool> used;
  vector<int> mt, cnt;
  vector<vector<int> > gr;
  kuhn(int n, int m) : n(n), m(m) {
    gr.resize(n);
    used.resize(n);
    mt.resize(m, -1);
    cnt.resize(m);
  }
  inline void add(int v, int u) {
    gr[v].push_back(u);
    ++cnt[u];
  }
  vector<int> ord;
  bool lets_celebrate_and(int v) {
    if (used[v]) return 0;
    used[v] = 1;
    for (auto to : gr[v]) {
      if (mt[to] == -1 || lets_celebrate_and(mt[to])) {
        mt[to] = v;
        return 1;
      }
    }
    return 0;
  }
  int mx(int need) {
    for (int i = 0; i < n; ++i) {
      sort((gr[i]).begin(), (gr[i]).end(),
           [&](const int &a, const int &b) { return (cnt[a] < cnt[b]); });
    }
    ord.resize(n);
    iota((ord).begin(), (ord).end(), 0);
    sort((ord).begin(), (ord).end(), [&](const int &a, const int &b) {
      return (gr[a].size() < gr[b].size());
    });
    int ans = 0;
    vector<bool> r(n);
    for (auto i : ord)
      for (auto to : gr[i]) {
        if (mt[to] == -1) {
          mt[to] = i;
          ++ans;
          r[i] = 1;
          break;
        }
      }
    if (ans >= need) return ans;
    for (auto i : ord) {
      if (r[i]) continue;
      if (lets_celebrate_and(i)) {
        ++ans;
        used.assign(n, 0);
      }
      if (ans >= need) break;
    }
    return ans;
  }
};
void solve() {
  int n, m, k, e;
  cin >> n >> m >> k >> e;
  vector<int> a(k);
  for (auto &i : a) cin >> i, --i;
  vector<vector<long long> > d(n, vector<long long>(n, 1e18));
  for (int i = 0; i < m; ++i) {
    int v, u, c;
    cin >> v >> u >> c;
    --v;
    --u;
    d[v][u] = d[u][v] = min(d[v][u], 1LL * c);
  }
  for (int i = 0; i < n; ++i) d[i][i] = 0;
  for (int k = 0; k < n; ++k) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
  auto ok = [&](long long x) {
    kuhn c(k, n);
    for (int i = 0; i < k; ++i) {
      for (int j = 0; j < n; ++j) {
        if (d[a[i]][j] > x) continue;
        c.add(i, j);
      }
    }
    return (c.mx(e) >= e);
  };
  long long l = 0, r = 1734000, mid, ans = -1;
  while (l <= r) {
    mid = l + r >> 1;
    if (ok(mid))
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  cout << ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int q = 1;
  while (q--) solve();
}
