#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; using namespace atcoder; typedef long long ll; typedef pair P; ll d[2][100010]; int n, m; vector

g[100010]; int a[200010], b[200010]; ll c[200010]; int x[200010]; const ll INF=1e18; int main() { cin>>n>>m; for(int i=0; i>a[i]>>b[i]>>c[i]>>x[i]; a[i]--; b[i]--; g[a[i]].push_back({b[i], i}); g[b[i]].push_back({a[i], i}); } fill(d[0], d[0]+n, INF); fill(d[1], d[1]+n, INF); d[0][n-1]=0; using Pl=pair; priority_queue, greater> que; que.push({0, {n-1, 0}}); while(!que.empty()){ auto p=que.top(); que.pop(); int x1=p.second.first; int t=p.second.second; if(p.first>d[t][x1]) continue; for(auto q:g[x1]){ int y1=q.first; int i=q.second; if(d[x[i]|t][y1]>d[t][x1]+c[i]){ d[x[i]|t][y1]=d[t][x1]+c[i]; que.push({d[x[i]|t][y1], {y1, (x[i]|t)}}); } } } for(int i=0; i