#include<cstdio>
#include<queue>
#include<cstring>
#define ll long long
#define mll 0x7f7f7f7f7f7f7f7f
using namespace std;
const int N=1e5+5,D=5e5;
struct node
{
int v,w,next;
}e[60*N];
priority_queue<pair<ll,int> >que;
int head[N*20],cnt,c,a[N];
ll dis[N*20];
bool f[N*20];
void add(int x,int y,int w)
{
e[++cnt].v=y; e[cnt].w=w;
e[cnt].next=head[x]; head[x]=cnt;
}
void build(int k,int l,int r)
{
if (l==r) {a[l]=k;return;}
int mid=l+r>>1;
add(k<<1,k,0); add(k<<1|1,k,0);
add(k+D,(k<<1|1)+D,0); add(k+D,(k<<1)+D,0);
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
}
void change(int k,int l,int r,int x,int y,int u,int w)
{
if (l>y||r<x) return;
if (x<=l&&r<=y) {if (c==2)add(u,k+D,w);else add(k,u+D,w); return;}
int mid=l+r>>1;
change(k<<1,l,mid,x,y,u,w);
change(k<<1|1,mid+1,r,x,y,u,w);
}
void dij(int u)
{
memset(dis,0x7f,sizeof(dis));
dis[u]=0; que.push(make_pair(0,u));
while (que.size())
{
int u=que.top().second; que.pop();
if (f[u]) continue;
f[u]=1;
for (int i=head[u];i;i=e[i].next)
{
int v=e[i].v,w=e[i].w;
if (dis[u]+w<dis[v]) dis[v]=dis[u]+w,que.push(make_pair(-dis[v],v));
}
}
}
int main()
{
int n,q,s;
scanf("%d%d%d",&n,&q,&s);
build(1,1,n);
for (int i=1; i<=n; i++) add(a[i],a[i]+D,0),add(a[i]+D,a[i],0);
while (q--)
{
int u,l,r,w;
scanf("%d",&c);
if (c==1) scanf("%d%d%d",&u,&l,&w),add(a[u],a[l]+D,w);
else
{
scanf("%d%d%d%d",&u,&l,&r,&w);
change(1,1,n,l,r,a[u],w);
}
}
dij(a[s]);
for (int i=1; i<=n; i++) if (dis[a[i]+D]!=mll) printf("%lld ",dis[a[i]+D]);else printf("-1 ");
return 0;
}