#include
#include
#include
#include
using namespace std;
const int N=100010;
int h[N], w[N], e[N], ne[N], cur;
int d[N];
bool st[N];
int n,m;
void add(int v1,int v2,int wg)
{
e[cur] = v2;
w[cur] = wg;
ne[cur] = h[v1];
h[v1] = cur ++;
}
int spfa() {
memset(d, 0x3f, sizeof d);//初始化
d[1] = 0;
queue<int> q;
q.push(1);//1为图中第一个点且1到其本身的最短路已知,即为0,将1入队
st[1] = true;//入队将节点标记为true
while (q.size()) {
int t = q.front();
q.pop();
st[t] = false;//出队将节点标记为false
for (int i = h[t]; i != -1; i = ne[i]) {//将与节点t直接有边相连的节点j进行遍历,如果j能通过点t进行松弛操作 , 则将j入队
int j = e[i];
if (d[j] > d[t] + w[i]) {//如果能进行松弛
d[j] = d[t] + w[i];
if (!st[j]) {
q.push(j);
st[j] = true;
}
}
}
}
return d[n];
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof(h));
while (m -- ) {
int v1, v2, w;
cin >> v1 >> v2 >> w;
add(v1, v2, w);
}
int t = spfa();
if (t == 0x3f3f3f3f) cout << "impossible" << endl;
else cout << t;
return 0;
}