#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <utility>
#include <vector>
#include <deque>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int N = 5e5 + 5;
int read() {
int x = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-')
w = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + (c - '0');
c = getchar();
}
return x * w;
}
struct Tree {
int l, r;
int pos;
#define l1(x) t1[x].l
#define r1(x) t1[x].r
#define l2(x) t2[x].l
#define r2(x) t2[x].r
#define pos1(x) t1[x].pos
#define pos2(x) t2[x].pos
}t1[N << 2], t2[N << 2];
int n, m, s;
int cnt;
struct Graph {
int v, nxt, w;
}e[N << 1];
int lk[N], ltp;
int rt1, rt2;
void ins(int u, int v, int w) {
e[++ltp] = (Graph) {v, lk[u], w};
lk[u] = ltp;
}
struct Node {
int pos, dis;
bool operator < (const Node &x) const {
return x.dis < dis;
}
};
priority_queue <Node> q;
void build(int p, int l, int r) {
l1(p) = l, l2(p) = l, r1(p) = r, r2(p) = r;
if(l == r) {
pos1(p) = l;
pos2(p) = l;
return ;
}
int mid = (l + r) >> 1;
rt1 = pos1(p) = ++cnt;
rt2 = pos2(p) = ++cnt;
build(p << 1, l, mid);
ins(pos1(p << 1), pos1(p), 0);
ins(pos2(p), pos2(p << 1), 0);
build(p << 1 | 1, mid + 1, r);
ins(pos1(p << 1 | 1), pos1(p), 0);
ins(pos2(p), pos2(p << 1 | 1), 0);
}
void change(int p, int l, int r, int x, int opt) {
if(l <= l1(p) && r1(p) <= r) {
if(opt) ins(x, p, 0);
else ins(p, x, 0);
return ;
}
int mid = (l1(p) + r1(p)) >> 1;
if(l <= mid) change(p << 1, l, r, x, opt);
if(r > mid) change(p << 1 | 1, l, r, x, opt);
}
int dis[N];
void bfs() {
memset(dis, 0x3f, sizeof(dis));
deque <int> q;
dis[s] = 0;
q.push_back(s);
while(!q.empty()) {
int p = q.front();
q.pop_front();
for(int i = lk[p]; i; i = e[i].nxt) {
int v = e[i].v, w = e[i].w;
if(dis[v] > dis[p] + w) {
dis[v] = dis[p] + w;
if(w) q.push_back(v);
else q.push_front(v);
}
}
}
}
int main() {
n = read(), m = read(), s = read();
cnt = n;
build(1, 1, n);
for(int i = 1; i <= m; i++) {
int a = read(), b = read(), c = read(), d = read(), x = ++cnt, y = ++cnt;
ins(x, y, 1);
change(1, a, b, x, 0);
change(1, c, d, y, 1);
x = ++cnt, y = ++cnt;
ins(x, y, 1);
change(1, c, d, x, 0);
change(1, a, b, y, 1);
}
bfs();
for(int i = 1; i <= n; i++)
printf("%d\n", dis[i]);
return 0;
}