#ifndef _GLIBCXX_NO_ASSERT #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#ifdef __GXX_EXPERIMENTAL_CXX0X__ #include #include #include #include #include #include #include #include //#endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include //#include #include //#include #include //#include #include #include #include #include //#include #include #include #include #include #include using namespace std; typedef pair P; vector>data; int main () { int N , C , V; cin >> N; cin >> C; cin >> V; vectorS ( V ) , T ( V ) , Y ( V ) , M ( V ); for( size_t i = 0; i < V; i++ ) { cin >> S[i]; S[i]--; } for( size_t i = 0; i < V; i++ ) { cin >> T[i]; T[i]--; } for( size_t i = 0; i < V; i++ ) { cin >> Y[i]; } for( size_t i = 0; i < V; i++ ) { cin >> M[i]; } data.resize ( N ); for( size_t i = 0; i < N; i++ ) { data[i].resize ( C + 1 ); for( size_t j = 0; j < C + 1; j++ ) { data[i][j] = INT_MAX / 3; } } data[0][0] = 0; priority_queue

, greater

>que; que.push ( P{ 0 , 0 } ); while( que.size () ) { P now = que.top (); que.pop (); int now_p = now.second; for( size_t i = 0; i < V; i++ ) { if( S[i] == now_p ) { for( size_t j = 0; j + Y[i] < C + 1; j++ ) { if( data[T[i]][j + Y[i]] > data[now_p][j] + M[i] ) { data[T[i]][j + Y[i]] = data[now_p][j] + M[i]; que.push ( P{ data[T[i]][j + Y[i]] , T[i] } ); } } } } } int ans = INT_MAX / 6; for( size_t i = 0; i < C + 1; i++ ) { ans = min ( ans , data[N - 1][i] ); } if( ans == INT_MAX / 6 ) { cout << -1 << endl; } else { cout << ans << endl; } return 0; }