/*思路:
首先找到起始点,然后让dist[i]等于其各点与起始点的权值,然后再找最小权值的边,让dist[点]=0;方便下次不在用它
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
const int Max_Size = 100;
class Dijkstra
{
private:
int node[Max_Size][Max_Size];
int dist[Max_Size];
int s[Max_Size];
int spot, vertex;
int index;
public:
Dijkstra()
{
spot = vertex = 0;
index = -1;
}
~Dijkstra() {}
void push(int n, int m)
{
spot = n;
vertex = m;
for(int i = 0; i < vertex; i++)
{
for(int j = 0; j < vertex; j++)
{
if(i == j)
{
node[i][j] = 0;
continue;
}
node[i][j] = 100000;
}
}
while(++index < vertex)
{
int i, j, a;
cin >> i >> j >> a;
node[i][j] = a;
}
}
void dijkstra(int v)//v为原点
{
s[0] = v;
for(int i = 0; i < spot; i++)
{
dist[i] = node[v][i];
}
dist[v] = 0;
index = 0;
while(index < spot - 1)
{
int k, min = 10000;
for(int i = 0; i < spot; i++)
{
if(dist[i] < min && dist[i] != 0)//找到权值最小的边
{
k = i;
min = dist[i];
}
}
s[++index] = k;
for(int i = 0; i < spot; i++)
{
if(dist[i] > node[k][i])
{
dist[i] = node[k][i];
}
}
dist[k] = 0;//使下次不再用那个点
}
}
void pop()
{
for(int i = 0; i < spot; i++)
{
cout << s[i] << endl;
}
}
};
int main()
{
Dijkstra p;
int n, m;
cin >> n >> m;
p.push(n, m);
p.dijkstra(0);
p.pop();
return 0;
}