#include #include #include #include #include #include using namespace std; typedef pair II; typedef pair III; typedef vector IntVec; typedef vector IIIVec; int main(int argc, char *argv[]) { string s; getline(cin, s); int N = atoi(s.c_str()); getline(cin, s); int C = atoi(s.c_str()); getline(cin, s); int V = atoi(s.c_str()); IntVec S(V), T(V), Y(V), M(V); { getline(cin, s); stringstream ss(s); for (int i = 0; i < V; ++i) { ss >> S[i]; } } { getline(cin, s); stringstream ss(s); for (int i = 0; i < V; ++i) { ss >> T[i]; } } { getline(cin, s); stringstream ss(s); for (int i = 0; i < V; ++i) { ss >> Y[i]; } } { getline(cin, s); stringstream ss(s); for (int i = 0; i < V; ++i) { ss >> M[i]; } } int road[50][50][2] = {}; for (int i = 0; i < V; ++i) { road[S[i] - 1][T[i] - 1][0] = Y[i]; road[S[i] - 1][T[i] - 1][1] = M[i]; } int cost[50][301]; memset(cost, 0x3f, sizeof(cost)); cost[0][0] = 0; for (int i = 1; i < N; ++i) { for (int j = 0; j < i; ++j) { int c = road[j][i][0]; if (c) { for (int k = 0; k <= C - c; ++k) { if (cost[j][k] <= C) { cost[i][k + c] = min(cost[i][k + c], cost[j][k] + road[j][i][1]); } } } } } int ans = 1 << 29; for (int i = 0; i <= C; ++i) { ans = min(ans, cost[N - 1][i]); } cout << (ans < (1<<29) ? ans : -1) << endl; return 0; }