#include
using namespace std;
const int maxn = 1e5 + 10;
const int INF = (1 << 30);
typedef long long ll;
const ll inf = (1LL << 59LL);
struct node{
int till, euro, time;
node (){}
node(int _t, int _timee, int _e){
till = _t;
time = _timee;
euro = _e;
}
};
vector graph[5005];
int n, m, S;
bool visited[3005][6005];
int idx[3005];
int main()
{
ios_base::sync_with_stdio(false);
cin >> S >> n >> m;
for(int i = 0; i < m; i++){
int a, b, c, d;
cin >> a >> b >> c >> d;
a--; b--;
graph[a].push_back(node(b, c, d));
graph[b].push_back(node(a, c, d));
}
memset(visited, false, sizeof visited);
int min_vreme = INF;
queue q;
q.push(0);
q.push(0);
q.push(0);
int sosed;
int weight, money;
int eee;
while(!q.empty()){
int teme = q.front();
q.pop();
int pari = q.front();
q.pop();
int pat = q.front();
q.pop();
if(teme == n - 1){
if(pat <= S){
min_vreme = min(min_vreme, pari);
}
continue;
}
for(int i = 0; i < (int)graph[teme].size(); i++){
sosed = graph[teme][i].till;
money = graph[teme][i].time;
weight = graph[teme][i].euro;
if(weight + pat <= S){
eee = money + pari;
if(eee >= 6000) eee -= 6000;
if(!visited[sosed][eee]){
visited[sosed][eee] = true;
q.push(sosed);
q.push(pari + money);
q.push(pat + weight);
}
}
}
}
q.push(0);
q.push(0);
q.push(0);
memset(visited, false, sizeof visited);
while(!q.empty()){
int teme = q.front();
q.pop();
int pari = q.front();
q.pop();
int pat = q.front();
q.pop();
if(teme == n - 1){
if(pat <= S){
min_vreme = min(min_vreme, pari);
}
continue;
}
for(int i = 0; i < (int)graph[teme].size(); i++){
sosed = graph[teme][i].till;
money = graph[teme][i].time;
weight = graph[teme][i].euro;
if(weight + pat <= S){
eee = pat + weight;
if(eee >= 6000){
eee -= 6000;
}
if(!visited[sosed][pat + weight]){
visited[sosed][pat + weight] = true;
q.push(sosed);
q.push(pari + money);
q.push(pat + weight);
}
}
}
}
q.push(0);
q.push(0);
q.push(0);
memset(idx, 0, sizeof idx);
memset(visited, false, sizeof visited);
while(!q.empty()){
int teme = q.front();
q.pop();
int pari = q.front();
q.pop();
int pat = q.front();
q.pop();
if(teme == n - 1){
if(pat <= S){
min_vreme = min(min_vreme, pari);
}
continue;
}
for(int i = 0; i < (int)graph[teme].size(); i++){
sosed = graph[teme][i].till;
money = graph[teme][i].time;
weight = graph[teme][i].euro;
if(weight + pat <= S){
eee = idx[sosed] + 1;
if(eee >= 6000){
eee -= 6000;
}
idx[sosed]++;
if(!visited[sosed][pat + weight]){
visited[sosed][pat + weight] = true;
q.push(sosed);
q.push(pari + money);
q.push(pat + weight);
}
}
}
}
if(min_vreme == INF){
cout << -1 << endl;
return 0;
}
cout << min_vreme << endl;
return 0;
}