将点按照距离分层,对每一层,计算有效点到下一层的最小颜色值
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
const int N=100005;
const int M=200005;
struct edge{
int u,v,clr; int next;
};
edge G[M<<1];
int head[N],inum;
inline void add(int u,int v,int clr,int p){
G[p].u=u; G[p].v=v; G[p].clr=clr; G[p].next=head[u]; head[u]=p;
}
namespace hashmap{
const int MOD=1000000;
int head[1000000],inum;
struct node{
int x,y,v;
int next;
}G[M];
inline void add(int x,int y,int v)
{
if (x>y) swap(x,y);
int h=((ll)x*2333333+y)%MOD;
for (int p=head[h];p;p=G[p].next)
if (G[p].x==x && G[p].y==y)
{
G[p].v=min(G[p].v,v);
return;
}
G[++inum].x=x; G[inum].y=y; G[inum].v=v; G[inum].next=head[h]; head[h]=inum;
}
inline void build()
{
for (int p=1;p<=inum;p++)
::add(G[p].x,G[p].y,G[p].v,++::inum),::add(G[p].y,G[p].x,G[p].v,++::inum);
}
}
int n,m;
int dis[N];
int Q[N],l,r;
#define V G[p].v
inline void bfs()
{
for (int i=1;i<n;i++) dis[i]=1<<30;
Q[++r]=n;
while (l<r)
{
int u=Q[++l];
for (int p=head[u];p;p=G[p].next)
if (dis[V]==1<<30)
{
dis[V]=dis[u]+1;
Q[++r]=V;
}
}
}
struct Node{
int v,next;
}edges[N];
int first[N],iinum;
bool vst[N];
inline void add2(int x,int v)
{
if (x<0) return;
edges[++iinum].v=v;
edges[iinum].next=first[x];
first[x]=iinum;
}
inline void Solve()
{
printf("%d\n",dis[1]);
for (int i=1;i<=n;i++)
add2(dis[1]-dis[i],i);
vst[1]=1;
int ret;
for (int i=0;i<dis[1];i++)
{
ret=1<<30;
for (int e=first[i],u;e;e=edges[e].next)
if (vst[u=edges[e].v])
for (int p=head[u];p;p=G[p].next)
if (dis[u]-1==dis[V])
ret=min(ret,G[p].clr);
if (i==0) printf("%d",ret); else printf(" %d",ret);
if (i==dis[1]-1) break;
for (int e=first[i],u;e;e=edges[e].next)
if (vst[u=edges[e].v])
for (int p=head[u];p;p=G[p].next)
if (dis[u]-1==dis[V] && G[p].clr==ret)
vst[V]=1;
}
}
int main()
{
int iu,iv,ic;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(m);
for (int i=1;i<=m;i++)
read(iu),read(iv),read(ic),hashmap::add(iu,iv,ic);
hashmap::build();
bfs();
Solve();
return 0;
}