#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define endl '\n'
//data structures
typedef pair<ll, ll> ii;
typedef vector<ii> vii;
typedef vector<ll> vll;
typedef vector<ld> vld;
typedef pair<long long, long long> pll;
typedef pair<char, ll> ci;
typedef pair<string, ll> si;
typedef vector<ll> vi;
typedef vector<string> vs;
typedef vector<vector<ll>> vvi;
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define sz(a) ((ll)a.size())
#define fi first
#define se second
#define whole(v) v.begin(), v.end()
#define rwhole(v) v.rbegin(), v.rend()
#define fro front
#define pqueue priority_queue
#define ubound upper_bound
#define lbound lower_bound
#define beg(v) v.begin()
//bit operations
ll flip(ll x){
    return ~(x) ^ (1 << 32);
}
ll allon(ll x){
    return (1LL << x) - 1;
}
bool bit(ll a, ll i){
    return (1LL << i) & a;
}
#define llpc(x) __builtin_popcountll(x)
#define ipc(x) __builtin_popcount(x)
#define iclz(x) __builtin_clz(x)
#define llclz(x) __builtin_clzll(x)
#define ictz(x) __builtin_ctz(x)
#define llctz(x) __builtin_ctzll(x)
//answers
#define cYES cout << "YES" << endl
#define cYes cout << "Yes" << endl
#define cyes cout << "yes" << endl
#define cNO cout << "NO" << endl
#define cNo cout << "No" << endl
#define cno cout << "no" << endl
#define ipsb cout << -1 << endl
const ll mod2 = 998244353;
const ll mod = 1000000007;
const ll inf = ll(1e18);
// read arr vec matr etc
#define fill(x, y) memset(x, y, sizeof(x))
void read(vector<ll> &x){
    for(auto &e:x) cin >> e;
}
void sread(vector<string> &x){
    for(auto &e:x) cin >> e;
}
void mread(vector<vector<ll>> &p, ll nnn, ll mmm){
    for(ll i = 0; i < nnn; ++i){
        vector<ll> pp;
        for(ll j = 0; j < mmm; ++j){
            ll wq; cin >> wq; pp.pb(wq);
        }
        p.pb(pp);
    }
}
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //high quality random number generator using time as seed
//ll random(ll l, ll r){return uniform_ll_distribution<ll>(l,r)(rng);} //returns a randomb number between [l, r]
// Solution
vector<map<ll, vvi>> edges(100005);
vi dp(100005, inf);
vector<map<ll, ll>> dp2(100005), sum(100005);
void tc(){
    ll n, m; cin >> n >> m;
    for(ll i = 0; i < m; ++i){
        ll u, v, c, val; cin >> u >> v >> c >> val;
        u--;
        v--;
        edges[u][c].pb({v, c, val});
        edges[v][c].pb({u, c, val});
        sum[u][c] += val;
        sum[v][c] += val;
    }
    pqueue<vi, vector<vi>, greater<vi>> pq;
    pq.push({0, 0, 0});
    dp[0] = 0;
    while(sz(pq)){
        vi act = pq.top();
        pq.pop();
        if(act[2]){
            if(dp2[act[1]][act[2]] != act[0]){
                continue;
            }
            for(auto edge:edges[act[1]][act[2]]){
                ll cost = act[0] + sum[act[1]][act[2]] - edge[2];
                if(dp[edge[0]] > cost){
                    dp[edge[0]] = cost;
                    pq.push({cost, edge[0], 0});
                }
            }
        }else{
            if(dp[act[1]] != act[0]){
                continue;
            }
            for(auto e:edges[act[1]]){
                for(auto edge:e.se){
                    ll cost = act[0] + sum[act[1]][edge[1]] - edge[2];
                    if(dp[edge[0]] > cost){
                        dp[edge[0]] = cost;
                        pq.push({cost, edge[0], 0});
                    }
                    cost = act[0] + edge[2];
                    if(dp[edge[0]] > cost){
                        dp[edge[0]] = cost;
                        pq.push({cost, edge[0], 0});
                    }
                    cost = act[0];
                    if(!dp2[edge[0]].count(edge[1]) || dp2[edge[0]][edge[1]] > cost){
                        dp2[edge[0]][edge[1]] = cost;
                        pq.push({cost, edge[0], edge[1]});
                    }
                }
            }
        }
    }
    cout << ((dp[n-1] == inf)? -1:dp[n-1]) << endl;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    ll t = 1;
    //cin >> t; 
    while(t--){
        tc();
    }
}
Compilation message (stderr)
Main.cpp: In function 'll flip(ll)':
Main.cpp:39:22: warning: left shift count >= width of type [-Wshift-count-overflow]
   39 |     return ~(x) ^ (1 << 32);
      |                    ~~^~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |