#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #define MAX 999999 using namespace std; int temp[1010],map[1005][1005],minnum[1005]; bool flag[1005]; int t,n,m,p,q,a,b,c,i,j; void Dijkstra(); int main() { scanf("%d",&t); while(t--) { memset(map,MAX,sizeof(map)); memset(flag,0,sizeof(flag)); memset(minnum,0,sizeof(minnum)); scanf("%d%d%d%d",&n,&m,&p,&q); minnum[q]=0; for(i=0;i<n;i++) scanf("%d",&temp[i]); for(i=0;i<p;i++) { scanf("%d%d%d",&a,&b,&c); map[a][b]=c;map[b][a]=c; } Dijkstra(); int min=MAX; for(i=0;i<m;i++) { if(minnum[temp[i]]<min) min=minnum[temp[i]]; } printf("%d ",min); } return 0; } void Dijkstra() { int min=MAX,l=0; for(i=1;i<=m;i++) { if(!flag[i]&&min>minnum[i]) { min=minnum[i]; l=i; } } if(l==0) return; flag[l]=1; for(i=1;i<=m;i++) { if(minnum[l]+map[l][i]<minnum[i]&&!flag[i]) minnum[i]=minnum[l]+map[l][i]; } Dijkstra(); }