#include #include #include using namespace std; static int A[100][100]; struct route_t { int src, dst, cost; }; bool operator <(const route_t &r1, const route_t &r2) { return r1.cost > r2.cost; } int search(int src, int dst, int n, int p[]) { static int d[100]; for(int i = 0; i < n; i++) { p[i] = -1; d[i] = -1; } priority_queue q; route_t r; int pos = src; d[src] = 0; while(true) { for(int i = 0; i < n; i++) { if(A[pos][i] > 0 && d[i] < 0 && !(pos == src && i == dst)) { r.src = pos; r.dst = i; r.cost = d[pos] + A[pos][i]; q.push(r); } } while(true) { if(q.empty()) return -1; r = q.top(); q.pop(); if(d[r.dst] < 0) break; } // cout << src + 1 << "," << dst + 1 << ": " << r.src + 1 << " -> " << r.dst + 1 << " (" << r.cost << ")" << endl; p[r.dst] = r.src; if(r.dst == dst) return r.cost; d[r.dst] = r.cost; pos = r.dst; } } int main(void) { int n, m; while(cin >> n >> m) { if(n == -1) break; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { A[i][j] = -1; } } for(int i = 0; i < m; i++) { int s, t, c; cin >> s >> t >> c; --s; --t; if(A[s][t] == -1 || A[s][t] > c) { A[s][t] = A[t][s] = c; } } list min_route; int min_len = -1; for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { if(A[i][j] < 0 || (min_len >= 0 && A[i][j] >= min_len)) { continue; } static int p[100]; int len = search(i, j, n, p); if(len < 0) continue; len += A[i][j]; if(min_len < 0 || min_len > len) { min_len = len; int pos = j; min_route.clear(); while(true) { min_route.push_back(pos + 1); if(pos == i) break; pos = p[pos]; } } } } if(min_len < 0) { cout << "No solution." << endl; } else { while(true) { cout << min_route.back(); min_route.pop_back(); if(min_route.empty()) break; cout << " "; } cout << endl; } } return 0; }