#include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int N = 100010; int n, m; int h[N], w[N], e[N], ne[N], idx; int dist[N]; bool st[N];//标记数字是否在队列中,防止存重复的点 void add(int a, int b, int c) { e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ; } int spfa() { memset(dist, 0x3f, sizeof dist); dist[1] = 0; queue<int> q;//存储所有待更新的点 q.push(1); st[1] = true;//标记已经放进去了 while (q.size()) { int t = q.front(); q.pop(); st[t] = false;//表示不在队列中了 for (int i = h[t]; i != -1; i = ne[i]) {//更新t的所有临边 int j = e[i]; if (dist[j] > dist[t] + w[i]) { dist[j] = dist[t] + w[i]; if (!st[j]) {//如果不在队列中,再加进去 q.push(j); st[j] = true;//标记 } } } } if (dist[n] == 0x3f3f3f3f) return -1; return dist[n]; } int main() { scanf("%d%d", &n, &m); memset(h, -1, sizeof h); while (m -- ) { int a, b, c; scanf("%d%d%d", &a, &b, &c); add(a, b, c); } int t = spfa(); if (t == -1) puts("impossible"); else printf("%d ", t); return 0; }