#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int vist[105];
int head[10005];
struct node
{
int from;
int to;
int next;
int len;
int c;
} s[10005];
struct Node
{
int l, v, in;
friend bool operator<(const Node &x, const Node &y)
{
if(x.l != y.l)
{
return x.l > y.l;
}
else
{
return x.v > y.v;
}
}
};
int ans;
int n, m, s1;
int cnt;
void add(int a, int b, int d, int e)
{
s[cnt].from = a;
s[cnt].to = b;
s[cnt].len = d;
s[cnt].next = head[a];
s[cnt].c = e;
head[a] = cnt;
cnt++;
}
void bfs()
{
priority_queue<Node>que;
Node cur, next;
cur.l = 0;
cur.v = 0;
cur.in = 1;
que.push(cur);
while(!que.empty())
{
cur = que.top();
que.pop();
if(cur.in == n)
{
ans = cur.l;
break;
}
int now = cur.in;
for(int i = head[now]; i != -1; i = s[i].next)
{
int u = s[i].to;
int temp = s[i].len + cur.l;
int mi = s[i].c + cur.v;
if(mi <= s1) //只要有硬币就可以继续查找,
{
next.in = u;
next.l = temp;
next.v = mi;
que.push(next);
}
}
}
}
int main()
{
int a, b, d, e;
while(scanf("%d", &s1) != EOF)
{
scanf("%d", &n);
scanf("%d", &m);
cnt = 0;
memset(head, -1, sizeof(head));
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d%d", &a, &b, &d, &e);
add(a, b, d, e);
}
memset(vist, 0, sizeof(vist));
ans = -1;
bfs();
printf("%d\n", ans);
}
return 0;
}