#include<bits/stdc++.h>
using namespace std;
bool done[10005];
int dis[10005],times[10005];
struct edge
{
int to,v;
edge(int a,int b) {to=a;v=b;}
};
vector<edge> g1[100005],g2[100005];
struct node
{
int id,dis;
node(int a,int b) {id=a;dis=b;}
bool operator <(const node no) const
{
return dis>no.dis;
}
};
void dijkr(int t)
{
priority_queue<node> q;
memset(dis,0x3f,sizeof(dis));
dis[t]=0;
q.push(node(t,0));
while(!q.empty())
{
node u=q.top();
q.pop();
if(done[u.id]) continue;
done[u.id]=1;
for(int i=0;i<g2[u.id].size();i++)
{
edge v=g2[u.id][i];
if(u.dis+v.v<dis[v.to])
{
dis[v.to]=u.dis+v.v;
q.push(node(v.to,dis[v.to]));
}
}
}
}
struct point
{
int p,g,h;
point(int a,int b,int c) {p=a;g=b;h=c;}
bool operator <(const point &p) const
{
return g+h>p.g+p.h;
}
};
void astar(int t,int k)
{
priority_queue<point> q;
q.push(point(1,0,dis[1]));
while(!q.empty())
{
point u=q.top();
q.pop();
times[u.p]++;
for(int i=0;i<g1[u.p].size();i++)
{
edge v=g1[u.p][i];
q.push(point(v.to,u.v+v.v,dis[y.to]));
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
while(m--)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
g1[a].push_back(edge(b,w));
g2[b].push_back(edge(a,w));
}
int s,t;
dijkr(t);
return 0;
}