rt,一种大常数新做法,tle了
#include <bits/stdc++.h>
using namespace std;
const int N=6e5+10;
struct e{int u,v,w;}E[N];
bool cmp(e a,e b){return a.w<b.w;}
int n,m;int cnt;int head[N];
struct EDGE{int v,w,next,id;}edge[N];
vector <int> col[N];int lst[N];
vector <int> dis[N];int MIN[N];
vector <int> vis[N];
vector <int> p[N];int pin[N];
void add(int u,int v,int w){
edge[++cnt].next=head[u];
if(edge[head[u]].w!=w)p[u].push_back(head[u]);
edge[cnt].v=v;edge[cnt].w=w;
col[v].push_back(w);dis[v].push_back(1e9);
vis[v].push_back(0);head[u]=cnt;
edge[cnt].id=col[v].size()-1;
}
struct node{
int u,id,dis;
bool operator <(const node &a)const{
return dis>a.dis;
}
};
priority_queue <node> Q;
void dijkstra(){
dis[1].push_back(1);vis[1].push_back(0);col[1].push_back(-1);
for(int i=1;i<=n;i++)MIN[i]=1e9;MIN[1]=1;
node st=(node){1,dis[1].size()-1,1};Q.push(st);
while(!Q.empty()){
node now=Q.top();Q.pop();
int u=now.u;int id=now.id;
//cout<<dis[u][id]<<endl;
if(vis[u][id])continue;
vis[u][id]=1;lst[u]++;
if(dis[u][id]>MIN[u])continue;
MIN[u]=min(MIN[u],dis[u][id]);
if(head[u]==0)continue;
if(lst[u]==1){
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;int w=edge[i].w;
if(dis[v][edge[i].id]>dis[u][id]+(w!=col[u][id]&&col[u][id]!=-1)){
dis[v][edge[i].id]=dis[u][id]+(w!=col[u][id]&&col[u][id]!=-1);
Q.push((node){v,edge[i].id,dis[v][edge[i].id]});
}
}
}
int l=0;int r=p[u].size()-1;
while(l<r){
int mid=(l+r)/2;
if(edge[p[u][mid]].w>=col[u][id])
r=mid;
else l=mid+1;
}
if(edge[p[u][l]].w!=col[u][id])continue;
for(int i=p[u][l];edge[i].w==col[u][id];i=edge[i].next){
int v=edge[i].v;
if(dis[v][edge[i].id]>dis[u][id]){
dis[v][edge[i].id]=dis[u][id];
Q.push((node){v,edge[i].id,dis[v][edge[i].id]});
}
}
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>E[i].u>>E[i].v>>E[i].w;
}sort(E+1,E+1+m,cmp);
for(int i=1;i<=m;i++){
add(E[i].u,E[i].v,E[i].w);
add(E[i].v,E[i].u,E[i].w);
}
for(int i=1;i<=n;i++)p[i].push_back(head[i]);
dijkstra();int ans=1e9;
for(int i=0;i<dis[n].size();i++){
ans=min(ans,dis[n][i]);
}
if(ans>m)cout<<-1;
else cout<<ans;
return 0;
}