//dij
#include<stdio.h>
#include<string.h>#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define min(x,y) (x<y?x:y)
int N,M,P,Q;
int city[105],dist[1005],cost[1005][1005];
bool vis[1005];
void dij(){
for(int i=1;i<=M;i++){
dist[i]=inf;
}
dist[Q]=0;
memset(vis,false,sizeof(vis));
for(int i=1;i<=M;i++){
int mmin=inf,pre=-1;
for(int j=1;j<=M;j++){
if(!vis[j]&&dist[j]<mmin){
mmin=dist[j];
pre=j;
}
}
vis[pre]=true;
for(int j=1;j<=M;j++){
if(cost[pre][j]==0){
continue;
}
if(!vis[j]&&cost[pre][j]+dist[pre]<dist[j]){
dist[j]=cost[pre][j]+dist[pre];
}
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&N,&M,&P,&Q);
for(int i=0;i<N;i++){
scanf("%d",&city[i]);
}
memset(cost,0,sizeof(cost));
for(int i=0;i<P;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(cost[a][b]==0){
cost[a][b]=cost[b][a]=c;
continue;
}
cost[a][b]=cost[b][a]=min(cost[a][b],c);
}
dij();
int ans=dist[city[0]];
for(int i=1;i<N;i++){
ans=min(ans,dist[city[i]]);
}
printf("%d\n",ans);
}
}