```cpp
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1e5 + 10;
int h[N], ne[N], e[N], w[N], idx;
int dis[N];
int n, m;
bool st[N];
void add(int a, int b, int c){
e[idx] = b;
ne[idx] = h[a];
w[idx] = c;
h[a] = idx ++ ;
}
int spfa(){
memset(dis, 0x3f, sizeof(dis));//初始化dis数组
dis[1] = 0;
queue<int>q;//建立储存最短路径节点的队列,如果该节点已经是最短路径,可以用该节点修改其他节点的值,就让该节点入队
q.push(1);//初始节点入队
st[1] = true;//利用st数组标记该节点已经入队
while(q.size()){//当队列不为空时
int t = q.front();//标记队首元素
q.pop();//队首元素出队
st[t] = false;//标记该节点已出队
for(int i = h[t]; i != -1; i = ne[i]){//以标记的节点为首节点进行便利
int j = e[i];//标记元素
if(dis[j] > dis[t] + w[i]){//如果被标记节点的距离值大于该节点到首节点的距离+首节点的距离值
dis[j] = dis[t] + w[i];//更新被标记节点的距离值
q.push(j);//将该节点入队
st[j] = true; //标记该节点已入队
}
}
}
return dis[n];
}
int main()
{
cin>>n>>m;
memset(h, -1, sizeof(h));//初始化邻接表
while(m -- ){
int a, b, c;
cin>>a>>b>>c;
add(a, b, c);
}
int t = spfa();
if(dis[n] == 0x3f3f3f3f) cout<<"impossible"<<endl;
else{
cout<<dis[n]<<endl;
}
return 0;
}