#include <bits/stdc++.h>
const int maxn = 2e5+10 ;
const int INF = 0x3f3f3f3f ;
std::priority_queue<std::pair<int,int>> Q;
std::vector<std::pair<int,int>> G[maxn];
std::queue<int>q;
int dis[maxn],c[maxn],deg[maxn],tot,n,m1,m2,s;
bool vis[maxn];
void dfs(int u)
{
for(auto &it:G[u])
{
if(!c[it.first]) c[it.first]=tot,dfs(it.first);
}
}
inline void dijkstra()
{
while(!Q.empty())
{
int u=Q.top().second;Q.pop();
if(vis[u])continue;
vis[u]=true;
for(auto &it:G[u])
{
int v=it.first,w=it.second;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(c[v]==c[u])Q.push(std::make_pair(-dis[v],v));
}
if(c[u]!=c[v]&&!--deg[c[v]])q.push(c[v]);
}
}
}
int main()
{
#ifdef LOCAL
freopen("input.in","r",stdin);
#endif
scanf("%d%d%d%d",&n,&m1,&m2,&s);
for(int i=1;i<=m1;i++)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
G[u].emplace_back(v,w);
G[v].emplace_back(u,w);
}
for(int i=1;i<=n;i++)
{
if(!c[i]) c[i]=++tot,dfs(i);
}
for(int i=1;i<=m2;i++)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
G[u].emplace_back(v,w);
deg[c[v]]++;
}
q.push(c[s]);
for(int i=1;i<=tot;i++)if(!deg[i])q.push(i);
memset(dis,127,sizeof dis);
dis[s]=0;
while(!q.empty())
{
int i=q.front();q.pop();
for(int j=1;j<=n;j++)
{
if(c[j]==i)
Q.push(std::make_pair(-dis[j],j));
}
dijkstra();
}
for(int i=1;i<=n;i++)
{
if(dis[i]>INF) puts("NO PATH");
else printf("%d\n",dis[i]);
}
return 0;
}