#include #include #include #include using namespace std ; struct node{ int index,najmal_pat,money; node(int i,int p,int m){ index = i; najmal_pat = p; money = m; } bool operator < (const node &tmp)const { return najmal_pat > tmp.najmal_pat; } }; int dist[3005][2005]; int main() { int S, N , M; cin >> S >> N >> M; vector graph[N+5]; for (int i = 0; i < M; i++) { int v,w,t,e; cin >> v >> w >> t >> e; graph[v].push_back(node(w,t,e)); graph[w].push_back(node(v,t,e)); } priority_queue pq; pq.push(node(1,0,0)); for (int i = 0; i < 3005; i++) { for (int j = 0; j < 2005; j++) { dist[i][j] = 2e9; } } dist[1][0] = 0; while(!pq.empty()){ node current = pq.top(); pq.pop(); for (int i = 0; i < graph[current.index].size(); i++) { int sosed = graph[current.index][i].index; int pat = graph[current.index][i].najmal_pat; int pari = graph[current.index][i].money; if(pari+current.money <= S && current.najmal_pat + pat < dist[sosed][pari+current.money]){ dist[sosed][pari + current.money] = current.najmal_pat + pat; pq.push(node(sosed,current.najmal_pat +pat,current.money + pari)); } } } int rezultat= 2e9; for (int i = 0; i <= S; i++) { rezultat = min(dist[N][i], rezultat); } if (rezultat == 2e9){ cout << "-1"; } else cout << rezultat << endl; }