#include<bits/stdc++.h>
#define int long long
#define N 100001
using namespace std;
inline void read(int&x)
{
x=0;bool f=1;
char ch=getchar();
while(ch<48||ch>57){f=!(ch==45);ch=getchar();}
while(ch>=48&&ch<=57){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
x=f?x:-x;
}
int n,m,s;
int hd[4*N],to[22*N],fm[22*N],vl[22*N],cnt;
inline void add(int x,int y,int w)
{
++cnt;
fm[cnt]=hd[x];
to[cnt]=y;
vl[cnt]=w;
hd[x]=cnt;
}
struct node
{
int l,r;
int ls,rs;
};
int num;
int rtin;
node ind[N<<1];
int rtot;
node otd[N<<1];
int build1(int L,int R)
{
if(L==R)
{
ind[L].l=L;
ind[L].r=R;
return L;
}
int u=++num;
int mid=(L+R)>>1;
ind[u].l=L;
ind[u].r=R;
ind[u].ls=build1(L,mid);
ind[u].rs=build1(mid+1,R);
add(u,ind[u].ls,0);
add(u,ind[u].rs,0);
return u;
}
int build2(int L,int R)
{
if(L==R)
{
otd[L].l=L;
otd[L].r=R;
return L;
}
int u=++num;
int mid=(L+R)>>1;
otd[u].l=L;
otd[u].r=R;
otd[u].ls=build2(L,mid);
otd[u].rs=build2(mid+1,R);
add(otd[u].ls,u,0);
add(otd[u].rs,u,0);
return u;
}
void connect2(int x,int w,int L,int R,int u)
{
if(L<=ind[u].l&&ind[u].r<=R)
{
add(x,u,w);
return;
}
int mid=(ind[u].l+ind[u].r)>>1;
if(L<=mid)connect2(x,w,L,R,ind[u].ls);
if(R>mid)connect2(x,w,L,R,ind[u].rs);
}
void connect3(int x,int w,int L,int R,int u)
{
if(L<=otd[u].l&&otd[u].r<=R)
{
add(u,x,w);
return;
}
int mid=(otd[u].l+otd[u].r)>>1;
if(L<=mid)connect3(x,w,L,R,otd[u].ls);
if(R>mid)connect3(x,w,L,R,otd[u].rs);
}
int d[N<<2];
bool in[N<<2];
struct nnd
{
int num;
bool operator<(const nnd x)const
{
return d[num]>d[x.num];
}
};
priority_queue<nnd>q;
inline void jk()
{
memset(d,0x3f,sizeof(d));
d[s]=0;
q.push((nnd){s});
while(!q.empty())
{
int u=q.top().num;
q.pop();
if(in[u])continue;
for(register int e=hd[u];e;e=fm[e])
{
int v=to[e];
int w=vl[e];
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
q.push((nnd){v});
}
}
}
}
signed main(void)
{
read(n);read(m);read(s);
num=n;
rtin=build1(1,n);
rtot=build2(1,n);
while(m--)
{
int op;read(op);
switch(op)
{
case 1:
{
int v,u,w;
read(v);read(u);read(w);
add(v,u,w);
break;
}
case 2:
{
int v,l,r,w;
read(v);read(l);read(r);read(w);
connect2(v,w,l,r,rtin);
break;
}
case 3:
{
int v,l,r,w;
read(v);read(l);read(r);read(w);
connect3(v,w,l,r,rtot);
break;
}
}
}
jk();
for(register int i=1;i<=n;++i)
{
if(d[i]==4557430888798830399)printf("%lld ",-1ll);
else printf("%lld ",d[i]);
}
return 0;
}