// #include<iostream>
// #include<map>
// #include<algorithm>
// #include<queue>
// #include<vector>

// using namespace std;
 
// typedef pair<int,int> P;
// typedef pair<int,P> P2;
 
// int n,m,l,k;
// int u,v,c;
// int s,g,t;
// int b[7];
 
// int dis[51][1<<7][10],vis[51][1<<7];
// vector<P> G[51];
// const int INF = 100000000;
 
// int main(){
//   while(cin >> n >> m >> l >> k,n+m+l+k){
//     for(int i=1;i<=n;i++)G[i].clear();
//     for(int i=0;i<m;i++){
//       cin >> u >> v >> c;
//       G[u].push_back(P(c,v));
//       G[v].push_back(P(c,u));
//     }
//     cin >> s >> g;
//     for(int i=0;i<l;i++)cin >> b[i];
 
//     for(int i=1;i<=n;i++)
//       for(int j=0;j<(1<<l);j++){
//     for(int x=0;x<k;x++)dis[i][j][x] = INF;
//     vis[i][j] = 0;
//       }
 
//     int st = 0;
//     for(int i=0;i<l;i++)if(s==b[i])st |= 1<<i;
 
//     priority_queue< P2,vector<P2>,greater<P2> > q;
//     q.push(P2(0,P(s,st)));
     
//     while(q.size()){
//       P2 p = q.top(); q.pop();
//       int dist = p.first, pos = p.second.first, state = p.second.second;
 
//       if(vis[pos][state] < k){
//     dis[pos][state][vis[pos][state]] = dist;
//     vis[pos][state]++;
//     if(pos==g && state==(1<<l)-1 && vis[pos][state]==k)break;
//       }else continue;
 
//       for(int i=0;i<G[pos].size();i++){
//     int cost = G[pos][i].first, nxt = G[pos][i].second;
//     int nstate = state;
//     for(int j=0;j<l;j++)if(nxt==b[j])nstate |= 1<<j;
 
//     if(vis[nxt][nstate] < k)q.push(P2(dist+cost,P(nxt,nstate)));
//       }
//     }
//     int res = dis[g][(1<<l)-1][k-1];
//     if(res==INF)cout << "NA\n";
//     else cout << res << endl;
//   }
// }


#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

int N,M,L,K;
int s,t;
vector<pii> G[51];
int d[11][51][1<<7];
int poses[11];
int id[111];

const int INF=1<<29;

int dijkstra(){
  for(int k=0;k<K;k++)
    for(int i=0;i<N;i++)
      for(int j=0;j<(1<<L);j++)
        d[k][i][j]=INF;
  priority_queue<pair<int,pii>,vector<pair<int,pii> >
                 ,greater<pair<int,pii> > > pq;
   int initMask=0;
   if(id[s]!=-1)initMask|=(1<<id[s]);
   pq.push(make_pair(0,pii(s,initMask)));
   d[0][s][initMask]=0;
   while(pq.size()){
     pair<int,pii> p=pq.top();pq.pop();
     const int ccost=p.first;
     const int cnode=p.second.first;
     const int cmask=p.second.second;
     if(ccost>d[K-1][cnode][cmask])continue;
     for(int i=0;i<(int)G[cnode].size();i++){
       int ncost=G[cnode][i].second+ccost;
       const int nnode=G[cnode][i].first;
       int nmask=cmask;
       const int x=id[nnode];
       if(x!=-1)nmask|=(1<<x);
       bool isUpdate=false;
       ll tmp=ncost;
       // 0番目からK-1番目まで順番に更新していく
       for(int j=0;j<K;j++){
         if(d[j][nnode][nmask]>=ncost){
           isUpdate=true;
           swap(d[j][nnode][nmask],ncost);
         }
       }
       if(isUpdate)
         pq.push(make_pair(tmp,
                           pii(nnode,nmask)));
     }
   }
   return d[K-1][t][(1<<L)-1];
 }

 int main(){
   while(cin>>N>>M>>L>>K&&(N|M|L|K)){
     for(int i=0;i<N;i++)G[i].clear();
     for(int i=0;i<M;i++){
       int a,b,c;
       cin>>a>>b>>c;
       a--;b--;
       G[a].push_back(pii(b,c));
       G[b].push_back(pii(a,c));
     }
     cin>>s>>t;
     s--;t--;
    memset(id,-1,sizeof(id));
    for(int i=0;i<L;i++){
      cin>>poses[i];
      poses[i]--;
      id[poses[i]]=i;
    }
    int res=dijkstra();
    if(res==INF)cout<<"NA"<<endl;
    else cout<<res<<endl;
  }
  return 0;
}


// int main(){
//   bool flg=false;
//   while(cin>>N>>M>>L>>K&&(N|M|L|K)){
//     if(N==34)flg=true;
//     if(flg)
//       cerr<<N<<" "<<M<<" "<<L<<" "<<K<<endl;
//     for(int i=0;i<N;i++)G[i].clear();
//     for(int i=0;i<M;i++){
//       int a,b,c;
//       cin>>a>>b>>c;
//       if(flg)
//         cerr<<a<<" "<<b<<" "<<c<<" ";
//       a--;b--;
//       G[a].push_back(pii(b,c));
//       G[b].push_back(pii(a,c));
//     }
//     if(flg)
//       cerr<<endl;
//     cin>>s>>t;
//     if(flg)
//       cerr<<s<<" "<<t<<endl;
//     s--;t--;
//     memset(id,-1,sizeof(id));
//     for(int i=0;i<L;i++){
//       cin>>poses[i];
//       if(flg)
//         cerr<<poses[i]<<endl;
//       poses[i]--;
//       id[poses[i]]=i;
//     }
//     int res=dijkstra();
//     // if(res==INF)cout<<"NA"<<endl;
//     // else cout<<res<<endl;
//   }
//   return 0;
// }