link
#include <iostream>
using namespace std;
int dis[200005];
bool vis[200005];
struct node
{
int y,z;
};
struct node2
{
int val,id;
bool operator>(const node2& y) const {return val>y.val;}
};
vector<node> a[200005];
priority_queue<node2,vector<node2>,greater<node2>> pq;
void priority_queue_dijstra()
{
while (!pq.empty())
{
int id=pq.top().id;
pq.pop();
if (vis[id]) continue;
vis[id]=true;
for (int i=0;i<a[id].size();i++)
{
int y=a[id][i].y,z=a[id][i].z;
if (dis[y]>dis[id]+z)
{
pq.push(node2{dis[y],y});
dis[y]=dis[id]+z;
}
}
}
}
int main()
{
int n,m,s,q;
cin>>n>>m>>s>>q;
for (int i=1;i<=n;i++)
{
dis[i]=1e9;
}
dis[s]=0;
for (int i=1;i<=m;i++)
{
int xi,yi,zi;
cin>>xi>>yi>>zi;
a[xi].push_back(node{yi,zi});
a[yi].push_back(node{xi,zi});
}
pq.push(node2{0,s});
priority_queue_dijstra();
for (int i=1;i<=q;i++)
{
int h;
cin>>h;
cout<<dis[h]<<endl;
}
}