#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
int const MAXN = 6e5;
struct node
{
int L, R;
int O, C;
int to;
int wight;
};
vector<node> edge[MAXN];
int f[MAXN];
int n, m, s;
bool vis[MAXN], vis1[MAXN];
int T;
void dfs(int l, int r, int now)
{
vis[now] = 1;
vis1[now] = 1;
if (f[now] != 0)
{
f[now] = min(r, f[now]);
}
else
{
f[now] = r;
}
for (auto p : edge[now])
{
if (p.to == s || p.to == now || vis1[p.wight])
{
continue;
}
if (l >= p.O && r <= p.C)
{
vis1[p.wight] = 1;
dfs(p.L, p.R, p.to);
}
}
return;
}
int main()
{
scanf("%d %d %d", &n, &m, &s);
node x{};
int sl{}, sr{}, u{}, v{};
for (int i = 1; i <= m; i++)
{
scanf("%d %d %d %d %d %d", &u, &v, &x.O, &x.C, &x.L, &x.R);
x.wight = i;
x.to = v;
edge[u].push_back(x);
if (v == s)
{
sl = x.L;
sr = x.R;
}
}
dfs(sl, sr, s);
f[s] = 0;
for (int i = 1; i <= n; i++)
{
if (vis[i])
{
T = max(T, f[i]);
}
}
printf("%d\n", T);
return 0;
}