Thông tin
include <bits/stdc++.h>
using namespace std;
define file "renet"
define FILE if(fopen(file".inp","r")){freopen(file".inp","r",stdin);freopen(file".out","w",stdout);}
const long long INF = 1e18;
int main(){ ios::syncwithstdio(false); cin.tie(0); FILE int n,k,m,t; cin>>n>>k>>m>>t;
vector<int> special(k);
vector<int> isSpecial(n+1,0);
for(int i=0;i<k;i++){
cin>>special[i];
isSpecial[special[i]]=1;
}
vector<vector<pair<int,int>>> g(n+1);
for(int i=0;i<m;i++){
int u,v,w;
cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
vector<int> need;
if(t==1){
need = special;
}else{
for(int i=1;i<=n;i++)
if(!isSpecial[i])
need.push_back(i);
}
int K = need.size();
int FULL = 1<<K;
vector<vector<long long>> dp(FULL, vector<long long>(n+1, INF));
for(int i=0;i<K;i++)
dp[1<<i][need[i]] = 0;
for(int mask=1; mask<FULL; mask++){
for(int sub=(mask-1)&mask; sub; sub=(sub-1)&mask)
for(int v=1; v<=n; v++)
dp[mask][v] = min(dp[mask][v],
dp[sub][v] + dp[mask^sub][v]);
priority_queue<pair<long long,int>,
vector<pair<long long,int>>,
greater<pair<long long,int>>> pq;
for(int v=1; v<=n; v++)
if(dp[mask][v] < INF)
pq.push({dp[mask][v],v});
while(!pq.empty()){
auto [d,u] = pq.top();
pq.pop();
if(d!=dp[mask][u]) continue;
for(auto [v,w]:g[u])
if(dp[mask][v] > d + w){
dp[mask][v] = d + w;
pq.push({dp[mask][v],v});
}
}
}
long long ans = INF;
for(int v=1; v<=n; v++)
ans = min(ans, dp[FULL-1][v]);
cout<<ans;
}