#include using namespace std; typedef long long ll; typedef vector vi; typedef vector vvi; #define rep(i,n) for(ll i=0;i<(n);i++) #define pii pair #define piii pair #define mp make_pair #define pb push_back #define ALL(a) (a).begin(),(a).end() #define FST first #define SEC second const int INF = (INT_MAX/2); const ll LLINF = (LLONG_MAX/2); const double eps = 1e-5; const double PI = M_PI; #define DEB cout<<"!"< Array; typedef vector matrix; int dp[51][301] ={}; // dp[N][C] = time struct edge{ int to,cost,time; }; vector G[51]; int main(){ int n,c,v; cin >> n>> c >> v; vi s(v),t(v),y(v),m(v); rep(i,v) cin >> s[i]; rep(i,v) cin >> t[i]; rep(i,v) cin >> y[i]; rep(i,v) cin >> m[i]; rep(i,v) G[s[i]].pb((edge){t[i],y[i],m[i]}); fill_n(dp[0],51*301,INF); priority_queue,greater > q; //cost,position dp[1][c] = 0; q.push(mp(c,1)); while(!q.empty()){ int id = q.top().SEC; int nowc = q.top().FST; q.pop(); for(int i = 0; i < G[id].size();i++){ if(nowc-G[id][i].cost>=0 && dp[id][nowc]+G[id][i].time < dp[G[id][i].to][nowc-G[id][i].cost]){ dp[G[id][i].to][nowc-G[id][i].cost]=dp[id][nowc]+G[id][i].time; q.push(mp(nowc-G[id][i].cost,G[id][i].to)); } } } int ans = INF; for(int i = 0; i <= 301; i++) ans = min(ans,dp[n][i]); cout << ((ans == INF)? -1 : ans) << endl; }