#include <bits/stdc++.h> using namespace std; const int maxn = 100005; int cnt; int head[maxn]; int dis[maxn]; bool st[maxn]; //用于记录节点是否在更新队列当中 struct Edge { int to, next, wt; }edges[maxn]; void add(int u, int v, int w) { edges[++cnt].to = v; edges[cnt].wt = w; edges[cnt].next = head[u]; head[u] = cnt; } int spfa(int s, int d) { memset(dis, 0x3f, sizeof dis); memset(st, 0, sizeof st); queue<int> q; //更新队列 dis[s] = 0; st[s] = true; q.push(s); while (q.size()) { int f = q.front(); q.pop(); st[f] = false; for (int e = head[f]; e != 0; e = edges[e].next) { int j = edges[e].to, w = edges[e].wt; if (dis[j] > dis[f] + w) { dis[j] = dis[f] + w; if (!st[j]) { q.push(j); st[j] = true; } } } } if (dis[d] < 0x3f3f3f3f) { return dis[d]; } else { return -1; } } int main() { #ifndef ONLINE_JUDGE freopen("D:/VS CODE/C++/in.txt", "r", stdin); freopen("D:/VS CODE/C++/out.txt", "w", stdout); #endif memset(head, -1, sizeof head); int n, m; cin >> n >> m; for (int i = 0;i < m;++i) { int u, v, w; scanf("%d %d %d", &u, &v, &w); add(u, v, w); } int t = spfa(1, n); if (t == -1) cout << "impossible" << endl; else { cout << t; } fclose(stdin); fclose(stdout); return 0; }