/*
I:(n,m)有向图
(n,m)有向图,可能重边或自环,边权可能为负(=不能dijkstra);
数据保证无负权回路;
O:最短距离或者“impossible”
I:
3 3
1 2 5
2 3 -3
1 3 4
O:
2
*/
#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;
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
int spfa()
{
// SPFA最短路:源,距,队状态,更新(i->j,i到每个邻接的点j)
int goal = 1;
int dist[N];
memset(dist, 0x3f, sizeof dist);
dist[goal] = 0;
queue<int> q;
q.push(1);
// 布尔数组:管理入队状态,是否在队
bool st[N];
st[1] = true;
while (q.size())
{
int t = q.front();
q.pop();
st[t] = false;
// 遍历当前节点i的每条边:边链表以-1结尾
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (dist[j] > dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
// 通过当前i点,更新了其末端j点,从而j的末端也可以更新
if (!st[j])
{
q.push(j);
st[j] = true;
}
}
}
}
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 == 0x3f3f3f3f) puts("impossible");
else printf("%d\n", t);
return 0;
}