#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5 + 5, inf = 1e18;
vector<array<int, 3>> adj[maxn];
vector<pair<int, int>> g[maxn];
int dist[maxn];
void solve(){
int n, m; cin >> n >> m;
for(int i = 1; i <= m; i++){
int u, v, c, p; cin >> u >> v >> c >> p;
adj[u].push_back({c, v, p});
adj[v].push_back({c, u, p});
}
int sz = n;
for(int t = 1; t <= n; t++){
sort(adj[t].begin(), adj[t].end()); //sort theo color
for(int i = 0; i < adj[t].size(); i++){
int j = i;
while(j + 1 < adj[t].size() && adj[t][i][0] == adj[t][j + 1][0]) j++;
int len = j - i + 1;
int u = t;
if(len == 1) g[u].push_back({adj[t][i][1], 0});
else {
int cur = ++sz;
g[u].push_back({cur, 0});
int sump = 0;
for(int k = i; k <= j; k++) sump += adj[t][k][2];
for(int k = i; k <= j; k++){
int v = adj[t][k][1], p = adj[t][k][2];
g[u].push_back({v, p});
g[v].push_back({cur, 0});
g[cur].push_back({v, sump - p});
}
}
i = j;
}
}
for(int i = 2; i <= sz; i++) dist[i] = inf;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
pq.push({0, 1});
while(pq.size()){
auto [d, u] = pq.top();
pq.pop();
if(dist[u] < d) continue;
for(auto [v, w]: g[u]){
if(dist[v] > dist[u] + w){
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
cout << (dist[n] == inf ? -1 : dist[n]);
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
solve();
}