import std.algorithm; import std.array; import std.ascii; import std.bigint; import std.complex; import std.container; import std.conv; import std.functional; import std.math; import std.range; import std.stdio; import std.string; import std.typecons; auto readInts() { return array(map!(to!int)(readln().strip().split())); } auto readInt() { return readInts()[0]; } auto readLongs() { return array(map!(to!long)(readln().strip().split())); } auto readLong() { return readLongs()[0]; } void readlnTo(T...)(ref T t) { auto s = readln().split(); assert(s.length == t.length); foreach(ref ti; t) { ti = s[0].to!(typeof(ti)); s = s[1..$]; } } const real eps = 1e-10; const long p = 1_000_000_000 + 7; void main(){ auto N = readInt(); auto C = readInt(); auto V = readInt(); auto S = readInts(); auto T = readInts(); auto Y = readInts(); auto M = readInts(); S[] -= 1; T[] -= 1; auto e = new Tuple!(int, int, int)[][](N); foreach(i; iota(V)) { e[S[i]] ~= tuple(T[i], Y[i], M[i]); } auto dp = new long[][](N, C+1); foreach(i; iota(N)) { foreach(j; iota(C+1)) { dp[i][j] = long.max/2; } } dp[0][0] = 0; foreach(i; iota(N)) { foreach(j; iota(C+1)) { foreach(ei; e[i]) { auto t = ei[0]; auto y = ei[1]; auto m = ei[2]; if(j+y > C) { continue; } dp[t][j+y] = min(dp[t][j+y], dp[i][j] + m); } } } auto ans = long.max; foreach(i; iota(C+1)) { ans = min(ans, dp[N-1][i]); } writeln(ans < long.max/2 ? ans: -1); }