n, m, k = (int(_) for _ in raw_input().split())

source, dest = (int(_) for _ in raw_input().split())
source = source - 1
dest = dest - 1

edges = [[] for _ in xrange(n)]
interesting = set()
for _ in xrange(m):
	a, b, lhs, rhs = (int(__) for __ in raw_input().split())
	a = a - 1
	b = b - 1
	lhs = lhs - 1
	rhs = rhs - 1
	edges[a].append((b, lhs, rhs))
	interesting.add(lhs)
	interesting.add(rhs+1)

vals = sorted(interesting)

ret = 0
for index, val in enumerate(vals):
	seen = [False] * n
	seen[source] = True
	queue = [source]
	while queue:
		curr = queue.pop()
		for edge in edges[curr]:
			if val >= edge[1] and val <= edge[2] and not seen[edge[0]]:
				seen[edge[0]] = True
				queue.append(edge[0])
	if seen[dest]:
		ret += vals[index+1] - val
print ret
