#include<bits/stdc++.h>
using namespace std;
#define ll long
#define mp make_pair
#define sc(x) scanf("%ld",&x)
#define ii pair<ll,ll>
#define pb push_back
#define INF INT_MAX
ll n;int e,source;
const int sz=100009;
vector g[100009];
ll dis[100009];
bool vis[100009];
void Dijkstra(ll source, ll n)
{
for(ll i=0;i<=n;++i)
vis[i]=0;
for(ll i=0;i< sz;i++)
dis[i]=INF;
class prioritize{public: bool operator ()(pair<int, int>&p1 ,pair<int, int>&p2){return p1.second>p2.second;}};
priority_queue<pair<int,int> ,vector<pair<int,int> >, prioritize> pq;
pq.push(mp(source,dis[source]=0));
while(!pq.empty())
{
pair<int, int> curr=pq.top();
pq.pop();
ll cv=curr.first,cw=curr.second;
if(vis[cv])
continue;
vis[cv]=true;
for(ll i=0;i< g[cv].size();i++)
if(!vis[g[cv][i].first] && g[cv][i].second+cw< dis[g[cv][i].first])
pq.push(make_pair(g[cv][i].first,(dis[g[cv][i].first]=g[cv][i].second+cw)));
}
for(ll i=1;i<=n;++i)
cout<< dis[i]<<" ";
}
int main()
{ ll tc,k,x,m,i,j;
sc(tc);
while(tc--)
{sc(n);sc(k);sc(x);sc(m);sc(source);
for(i=1;i<=sz;++i)
g[i].clear();
for(i=1;i<=k;++i)
{
for(j=1;j<=k;++j)
{
if(i!=j)
g[i].pb(mp(j,x));
}
}
while(m--)
{
sc(i);sc(j);sc(k);
g[i].pb(mp(j,k));
g[j].pb(mp(i,k));
}
Dijkstra(source,n);
cout<<"\n";
}
return 0;
}