#define N 110
int g[N][N];
int dis[N][N];
int ans[N];
int p[N][N];//记录i——j之间的路径
int n,m;
int minm;
int cnt;
int mid;
void floyd(){
int i,j,k;
for(k=1;k<=n;k++){
//求环
for(i=1;i<k;i++){
for(j=1;j<i;j++){
if(dis[i][j]+g[i][k]+g[j][k]<minm){
minm = dis[i][j]+g[i][k]+g[j][k];
cnt = 0;
mid = j;
while(mid != i){
ans[cnt++] = mid;
mid = p[i][mid];
}
ans[cnt++] = i;
ans[cnt++] = k;
}
}
}
//求最短路
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(dis[i][k]+dis[k][j]<dis[i][j]){
dis[i][j] = dis[i][k]+dis[k][j];
p[i][j] = p[k][j];
}
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m) != -1){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
g[i][j] = MAX;
dis[i][j] = MAX;
p[i][j] = i;
}
g[i][i] = dis[i][i] = 0;
}
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(c < g[a][b]){
g[a][b] = g[b][a] = c;
dis[a][b] = dis[b][a] = c;
}
}
minm = MAX;
floyd();
if(minm == MAX)puts("No solution.");
else {
for(i=0;i<cnt;i++)
puts("");
}
}
return 0;
}