#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=1e5+5;
int pla[3][N],n;
bool vis[N];long long dis[N];
struct Tree{
int ls,rs;
}tree[9*N];
struct node{
int to,next;
long long w;
}edge[900010];//edge[8*N+1e5+5];
int head[N],tot;
void add(int u,int v,long long w){
edge[++tot]=(node){v,w,head[u]};
head[u]=tot;
}
struct Heap{long long sum;int id;};
struct cmp{
bool operator()(Heap a,Heap b)
{
return a.sum>b.sum;
}
};
priority_queue<Heap,vector<Heap>,cmp>q;
void dij(int s){
for(int i=0;i<=n;i++)
dis[i]=1e14+5;
memset(vis,0,sizeof(vis));
dis[s]=0;
q.push((Heap){0,s});
while(q.size())
{
int u=q.top().id;q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(!vis[v]&&dis[v]>dis[u]+edge[i].w)
{
dis[v]=dis[u]+edge[i].w;
q.push((Heap){dis[v],v});
}
}
}
}
void build(int fa,int x,int l,int r,int ki){
if(ki==1) add(fa,x,0);
else add(x,fa,0);
if(l==r)
{
pla[ki][l]=x;
return ;
}
int mid=(l+r)/2;
tree[x].ls=tot+1;(x,++tot,l,mid,ki);
tree[x].rs=tot+1;(x,++tot,mid+1,r,ki);
}
void put(int x,int l,int r,int L,int R,int w,int ki,int to){
if(L<=l&&r<=R)
{
if(ki==1)add(to,x,w);
else add(x,to,w);
return ;
}
int mid=(l+r)/2;
if(l<=mid) put(tree[ki].ls,l,mid,L,R,w,ki,to);
if(r>=mid+1) put(tree[ki].rs,mid+1,r,L,R,w,ki,to);
}
int main()
{
int m,s,tool1,tool2;
scanf("%d %d %d",&n,&m,&s);
tool1=1;build(0,tool1,1,n,1);
tool2=++tot;build(0,tool2,1,n,2);
for(int i=1;i<=n;i++)
{
int l1=pla[1][i],l2=pla[2][i];
add(l1,l2,0);
add(l2,l1,0);
}
for(int i=1;i<=m;i++)
{
int ol,u,v,l,r;
long long w;
scanf("%d",&ol);
if(ol==1)
{
scanf("%d %d %lld",&u,&v,&w);
add(pla[1][u],pla[2][v],w);
}
if(ol==2)
{
scanf("%d %d %d %lld",&u,&l,&r,&w);
put(tool1,1,n,l,r,w,1,pla[2][u]);
}
if(ol==3)
{
scanf("%d %d %d %lld",&u,&l,&r,&w);
put(tool2,1,n,l,r,w,2,pla[1][u]);
}
}
dij(s);
for(int i=1;i<=n;i++)
{
if(i>=1e14) printf("-1 ");
else printf("%lld ",dis[i]);
}
}