#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
typedef vector<int> VI;
const int N = 100;
struct edge {
int from, to, cost;
};
VI parent, DSUparent, DSUrank, colour; //parent, colour для DFS. Остальное для disjoint-set
vector <edge> edges, result; //в result входят все вершины, которые досягаемы из цикла с наименьшим весом
vector <VI> graph (N, VI(0)); // adjacency list
vector < vector <bool> > visited (N, vector <bool>(N)); // Хранятся использованные рёбра
int cycle_end, cycle_st; // конец и начало цикла, которые найдены DFS
int n, m; // для чтения задачи
bool foundCycle;
//
// disjoint-set
int findSet (int v) {
return (v == DSUparent[v]) ? v : (DSUparent[v] = findSet (DSUparent[v]));
}
inline void makeSet (int a) {
DSUrank[a] = 0;
DSUparent[a] = a;
}
void unionSet (int a, int b) {
a = findSet(a);
b = findSet(b);
if (a == b) {
return;
}
if (DSUrank[a] > DSUrank[b]) {
DSUparent[b] = a;
} else {
DSUparent[a] = b;
if (DSUrank[a] == DSUrank[b]) {
DSUrank[b] = DSUrank[b] + 1;
}
}
}
//жадный алгоритм, который находит все вершины, которые можно найти из цикла с
// наименьшим весом. Принцип работы как у алгоритма Крускала.
bool kruskal (vector <edge> e) {
bool done = false;
for (auto i : e) {
int from = i.from, to = i.to;
if (findSet (to) == findSet (from) && !visited[from][to] && !visited[to][from]) {
done = true;
}
if (!visited[from][to] && !visited[to][from]) {
result.push_back (i);
unionSet (from, to);
visited[from][to] = true;
visited[to][from] = true;
if (done) {
return true;
}
}
}
return false;
}
//DFS, который находит цикл.
int dfs (int v) {
colour[v] = 1;
for (auto u : graph[v]) {
if (colour[u] == 0) {
parent[u] = v;
dfs (u);
} else if (colour[u] == 1 && parent[v] != u) {
parent[u] = v;
cycle_end = v;
cycle_st = u;
return 0;
}
}
colour[v] = 2;
return 0;
}
// чтение графа
void readData () {
for (auto& v : visited) {
v.assign(N, false);
}
edges.clear();
parent.clear();
DSUrank.clear();
DSUparent.clear();
colour.clear();
result.clear();
result.resize(0);
edges.resize(m);
parent.resize(n);
DSUrank.resize(n);
DSUparent.resize(n);
colour.resize(n);
// непосредственное чтение
for (int i = 0; i < m; i++) {
int x, y, z;
scanf ("%d %d %d", &x, &y, &z);
x--; y--;
edges[i] = {x, y, z};
}
// сортируем все рёбра в порядке возрастания веса
sort (all(edges), [](auto a, auto b) {return a.cost < b.cost;});
// для disjoint-set
for (int i = 0; i < n; i++) {
makeSet (i);
}
//наличие цикла, а также записывание "наименьшего цикла" в
// vector <edge> result
foundCycle = kruskal (edges);
}
void solve () {
if (foundCycle) {
for (auto& v : graph) {
v.resize(0);
v.shrink_to_fit();
}
// на основе vector <edge> result
// конструируем граф
for (auto i : result) {
graph[i.from].push_back (i.to);
graph[i.to].push_back (i.from);
}
colour.assign (n, 0);
parent.assign (n, -1);
for (int j = 0; j < n; j++) {
if (colour[j] == 0) {
dfs(j);
}
}
vector<int> cycle;
cycle.push_back (cycle_st);
for (int v=cycle_end; v!=cycle_st; v=parent[v]) {
cycle.push_back (v);
}
reverse (all(cycle));
for (auto k : cycle) {
printf ("%d ", k + 1);
}
foundCycle = false;
printf ("\n");
} else {
cout << "No solution." <<"";
printf ("\n");
}
}
int main() {
int count = 6;
while (count > 1) {
scanf ("%d", &n);
if (n < 0) {
break;
} else {
scanf ("%d", &m);
readData();
solve();
count--;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGFsbCh4KSAoeCkuYmVnaW4oKSwoeCkuZW5kKCkKI2RlZmluZSBzeih4KSAoKGludCkoeCkuc2l6ZSgpKQp0eXBlZGVmIHZlY3RvcjxpbnQ+IFZJOwoKY29uc3QgaW50IE4gPSAxMDA7CgpzdHJ1Y3QgZWRnZSB7CiAgICBpbnQgZnJvbSwgdG8sIGNvc3Q7Cn07CgpWSSBwYXJlbnQsIERTVXBhcmVudCwgRFNVcmFuaywgY29sb3VyOyAvL3BhcmVudCwgY29sb3VyINC00LvRjyBERlMuINCe0YHRgtCw0LvRjNC90L7QtSDQtNC70Y8gZGlzam9pbnQtc2V0CnZlY3RvciA8ZWRnZT4gZWRnZXMsIHJlc3VsdDsgICAgICAgICAgIC8v0LIgcmVzdWx0INCy0YXQvtC00Y/RgiDQstGB0LUg0LLQtdGA0YjQuNC90YssINC60L7RgtC+0YDRi9C1INC00L7RgdGP0LPQsNC10LzRiyDQuNC3INGG0LjQutC70LAg0YEg0L3QsNC40LzQtdC90YzRiNC40Lwg0LLQtdGB0L7QvAp2ZWN0b3IgPFZJPiBncmFwaCAoTiwgVkkoMCkpOyAgICAgICAgICAvLyBhZGphY2VuY3kgbGlzdAp2ZWN0b3IgPCB2ZWN0b3IgPGJvb2w+ID4gdmlzaXRlZCAoTiwgdmVjdG9yIDxib29sPihOKSk7IC8vINCl0YDQsNC90Y/RgtGB0Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC90YvQtSDRgNGR0LHRgNCwCmludCBjeWNsZV9lbmQsIGN5Y2xlX3N0OyAgICAgICAgICAgICAgIC8vINC60L7QvdC10YYg0Lgg0L3QsNGH0LDQu9C+INGG0LjQutC70LAsINC60L7RgtC+0YDRi9C1INC90LDQudC00LXQvdGLIERGUwppbnQgbiwgbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDQtNC70Y8g0YfRgtC10L3QuNGPINC30LDQtNCw0YfQuApib29sIGZvdW5kQ3ljbGU7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gCi8vIGRpc2pvaW50LXNldCAKaW50IGZpbmRTZXQgKGludCB2KSB7CiAgICByZXR1cm4gKHYgPT0gRFNVcGFyZW50W3ZdKSA/IHYgOiAoRFNVcGFyZW50W3ZdID0gZmluZFNldCAoRFNVcGFyZW50W3ZdKSk7Cn0KaW5saW5lIHZvaWQgbWFrZVNldCAoaW50IGEpIHsKICAgIERTVXJhbmtbYV0gPSAwOwogICAgRFNVcGFyZW50W2FdID0gYTsKfQp2b2lkIHVuaW9uU2V0IChpbnQgYSwgaW50IGIpIHsKICAgIGEgPSBmaW5kU2V0KGEpOwogICAgYiA9IGZpbmRTZXQoYik7CgogICAgaWYgKGEgPT0gYikgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChEU1VyYW5rW2FdID4gRFNVcmFua1tiXSkgewogICAgICAgIERTVXBhcmVudFtiXSA9IGE7CiAgICB9IGVsc2UgewogICAgICAgIERTVXBhcmVudFthXSA9IGI7CiAgICAgICAgaWYgKERTVXJhbmtbYV0gPT0gRFNVcmFua1tiXSkgewogICAgICAgICAgICBEU1VyYW5rW2JdID0gRFNVcmFua1tiXSArIDE7CiAgICAgICAgfQogICAgfQp9Ci8v0LbQsNC00L3Ri9C5INCw0LvQs9C+0YDQuNGC0LwsINC60L7RgtC+0YDRi9C5INC90LDRhdC+0LTQuNGCINCy0YHQtSDQstC10YDRiNC40L3Riywg0LrQvtGC0L7RgNGL0LUg0LzQvtC20L3QviDQvdCw0LnRgtC4INC40Lcg0YbQuNC60LvQsCDRgSAKLy8g0L3QsNC40LzQtdC90YzRiNC40Lwg0LLQtdGB0L7QvC4g0J/RgNC40L3RhtC40L8g0YDQsNCx0L7RgtGLINC60LDQuiDRgyDQsNC70LPQvtGA0LjRgtC80LAg0JrRgNGD0YHQutCw0LvQsC4KCmJvb2wga3J1c2thbCAodmVjdG9yIDxlZGdlPiBlKSB7CiAgICBib29sIGRvbmUgPSBmYWxzZTsKCiAgICBmb3IgKGF1dG8gaSA6IGUpIHsKICAgICAgICBpbnQgZnJvbSA9IGkuZnJvbSwgdG8gPSBpLnRvOwogICAgICAgIGlmIChmaW5kU2V0ICh0bykgPT0gZmluZFNldCAoZnJvbSkgJiYgIXZpc2l0ZWRbZnJvbV1bdG9dICYmICF2aXNpdGVkW3RvXVtmcm9tXSkgewogICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCF2aXNpdGVkW2Zyb21dW3RvXSAmJiAhdmlzaXRlZFt0b11bZnJvbV0pIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayAoaSk7CiAgICAgICAgICAgIHVuaW9uU2V0IChmcm9tLCB0byk7CiAgICAgICAgICAgIHZpc2l0ZWRbZnJvbV1bdG9dID0gdHJ1ZTsKICAgICAgICAgICAgdmlzaXRlZFt0b11bZnJvbV0gPSB0cnVlOwogICAgICAgICAgICBpZiAoZG9uZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KLy9ERlMsINC60L7RgtC+0YDRi9C5INC90LDRhdC+0LTQuNGCINGG0LjQutC7LgppbnQgZGZzIChpbnQgdikgewogICAgY29sb3VyW3ZdID0gMTsKICAgIGZvciAoYXV0byB1IDogZ3JhcGhbdl0pIHsKICAgICAgICBpZiAoY29sb3VyW3VdID09IDApICB7CiAgICAgICAgICAgIHBhcmVudFt1XSA9IHY7CiAgICAgICAgICAgIGRmcyAodSk7CiAgICAgICAgfSBlbHNlIGlmIChjb2xvdXJbdV0gPT0gMSAmJiBwYXJlbnRbdl0gIT0gdSkgewogICAgICAgICAgICBwYXJlbnRbdV0gPSB2OwogICAgICAgICAgICBjeWNsZV9lbmQgPSB2OwogICAgICAgICAgICBjeWNsZV9zdCA9IHU7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGNvbG91clt2XSA9IDI7CiAgICByZXR1cm4gMDsKfQovLyDRh9GC0LXQvdC40LUg0LPRgNCw0YTQsAp2b2lkIHJlYWREYXRhICgpIHsKICAgIGZvciAoYXV0byYgdiA6IHZpc2l0ZWQpIHsKICAgICAgICB2LmFzc2lnbihOLCBmYWxzZSk7CiAgICB9CiAgICBlZGdlcy5jbGVhcigpOwogICAgcGFyZW50LmNsZWFyKCk7CiAgICBEU1VyYW5rLmNsZWFyKCk7CiAgICBEU1VwYXJlbnQuY2xlYXIoKTsKICAgIGNvbG91ci5jbGVhcigpOwogICAgcmVzdWx0LmNsZWFyKCk7CiAgICByZXN1bHQucmVzaXplKDApOwogICAgZWRnZXMucmVzaXplKG0pOwogICAgcGFyZW50LnJlc2l6ZShuKTsKICAgIERTVXJhbmsucmVzaXplKG4pOwogICAgRFNVcGFyZW50LnJlc2l6ZShuKTsKICAgIGNvbG91ci5yZXNpemUobik7CiAgICAvLyDQvdC10L/QvtGB0YDQtdC00YHRgtCy0LXQvdC90L7QtSDRh9GC0LXQvdC40LUKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgaW50IHgsIHksIHo7CiAgICAgICAgc2NhbmYgKCIlZCAlZCAlZCIsICZ4LCAmeSwgJnopOwogICAgICAgIHgtLTsgeS0tOwogICAgICAgIGVkZ2VzW2ldID0ge3gsIHksIHp9OwogICAgfQogICAgLy8g0YHQvtGA0YLQuNGA0YPQtdC8INCy0YHQtSDRgNGR0LHRgNCwINCyINC/0L7RgNGP0LTQutC1INCy0L7Qt9GA0LDRgdGC0LDQvdC40Y8g0LLQtdGB0LAKICAgIHNvcnQgKGFsbChlZGdlcyksIFtdKGF1dG8gYSwgYXV0byBiKSB7cmV0dXJuIGEuY29zdCA8IGIuY29zdDt9KTsKICAgIC8vINC00LvRjyBkaXNqb2ludC1zZXQKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgbWFrZVNldCAoaSk7CiAgICB9CiAgICAvL9C90LDQu9C40YfQuNC1INGG0LjQutC70LAsINCwINGC0LDQutC20LUg0LfQsNC/0LjRgdGL0LLQsNC90LjQtSAi0L3QsNC40LzQtdC90YzRiNC10LPQviDRhtC40LrQu9CwIiDQsiAKICAgIC8vIHZlY3RvciA8ZWRnZT4gcmVzdWx0CiAgICBmb3VuZEN5Y2xlID0ga3J1c2thbCAoZWRnZXMpOwp9CnZvaWQgc29sdmUgKCkgewoKICAgIGlmIChmb3VuZEN5Y2xlKSB7CiAgICAgICAgZm9yIChhdXRvJiB2IDogZ3JhcGgpIHsKICAgICAgICAgICAgdi5yZXNpemUoMCk7CiAgICAgICAgICAgIHYuc2hyaW5rX3RvX2ZpdCgpOwogICAgICAgIH0KICAgICAgICAvLyDQvdCwINC+0YHQvdC+0LLQtSB2ZWN0b3IgPGVkZ2U+IHJlc3VsdAogICAgICAgIC8vINC60L7QvdGB0YLRgNGD0LjRgNGD0LXQvCDQs9GA0LDRhAogICAgICAgIGZvciAoYXV0byBpIDogcmVzdWx0KSB7CiAgICAgICAgICAgIGdyYXBoW2kuZnJvbV0ucHVzaF9iYWNrIChpLnRvKTsKICAgICAgICAgICAgZ3JhcGhbaS50b10ucHVzaF9iYWNrIChpLmZyb20pOwogICAgICAgIH0KCiAgICAgICAgY29sb3VyLmFzc2lnbiAobiwgMCk7CiAgICAgICAgcGFyZW50LmFzc2lnbiAobiwgLTEpOwoKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBpZiAoY29sb3VyW2pdID09IDApIHsKICAgICAgICAgICAgICAgIGRmcyhqKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmVjdG9yPGludD4gY3ljbGU7CgogICAgICAgIGN5Y2xlLnB1c2hfYmFjayAoY3ljbGVfc3QpOwoKICAgICAgICBmb3IgKGludCB2PWN5Y2xlX2VuZDsgdiE9Y3ljbGVfc3Q7IHY9cGFyZW50W3ZdKSB7CiAgICAgICAgICAgIGN5Y2xlLnB1c2hfYmFjayAodik7CiAgICAgICAgfQoKICAgICAgICByZXZlcnNlIChhbGwoY3ljbGUpKTsKCiAgICAgICAgZm9yIChhdXRvIGsgOiBjeWNsZSkgewogICAgICAgICAgICBwcmludGYgKCIlZCAiLCBrICsgMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvdW5kQ3ljbGUgPSBmYWxzZTsKICAgICAgICBwcmludGYgKCJcbiIpOwogICAgICAgIAogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICJObyBzb2x1dGlvbi4iIDw8IiI7CiAgICAgICAgcHJpbnRmICgiXG4iKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgY291bnQgPSA2OwogICAgd2hpbGUgKGNvdW50ID4gMSkgewogICAgICAgIHNjYW5mICgiJWQiLCAmbik7CiAgICAgICAgaWYgKG4gPCAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNjYW5mICgiJWQiLCAmbSk7CiAgICAgICAgICAgIHJlYWREYXRhKCk7CiAgICAgICAgICAgIHNvbHZlKCk7CiAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0=