#include<stdio.h> #include<string.h> #define inf 0x3fffffff #define N 1100 int ma[N][N],dis[N],a[N]; int m; void dijkstra(int start) { int visit[N],mi,f,i,j; memset(visit,0,sizeof(visit)); for(i=1;i<=m;i++) dis[i]=ma[start][i]; visit[start]=1; for(i=1;i<m;i++) { mi=inf; f=1; for(j=1;j<=m;j++) if(!visit[j]&&mi>dis[j]) { f=j; mi=dis[j]; } if(mi==inf) break; visit[f]=1; for(j=1;j<=m;j++) if(ma[f][j]<inf) { if(dis[j]>dis[f]+ma[f][j]) dis[j]=dis[f]+ma[f][j]; } } return ; } int main() { int t,n,i,j,k,p,q; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&n,&m,&p,&q); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=m;i++) for(j=1;j<=m;j++) ma[i][j]=inf; while(p--) { scanf("%d%d%d",&i,&j,&k); if(ma[i][j]>k||ma[j][i]>k) ma[i][j]=ma[j][i]=k; } dijkstra(q); j=inf; for(i=1;i<=n;i++) if(j>dis[a[i]]) j=dis[a[i]]; printf("%d ",j); } return 0; }