#include<iostream>
using namespace std;
#define NUM 100
int n;
int m;
int a[NUM][NUM];
int x[NUM];
int bestx[NUM];
int cc;
int bestc;
int NoEdge=-1;
void BackTrack(int t)
{
int i;
if(t==n)
{
if(a[x[n-1]][x[n]]!=NoEdge&&a[x[n]][1]!=NoEdge&&
(cc+a[x[n-1]][x[n]]+a[x[n]][1]<bestc||bestc==NoEdge))
{
for(i=1;i<=n;i++)
bestx[i]=x[i];
bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];
}
return ;
}
else
{
for(i=t;i<=n;i++)
{
if(a[x[t-1]][x[i]]!=NoEdge&&(cc+a[x[t-1]][x[i]]<bestc||bestc==NoEdge))
{
swap(x[t],x[i]);
cc+=a[x[t-1]][x[t]];
BackTrack(t+1);
cc-=a[x[t-1]][x[t]];
swap(x[t],x[i]);
}
}
}
}
int main()
{
while(cin>>n&&n)
{
cin>>m;
int i,j,length;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=NoEdge;
for(int k=1;k<=m;k++)
{
cin>>i>>j>>length;
a[i][j]=a[j][i]=length;
}
for(i=1;i<=n;i++)
x[i]=i;
bestc=NoEdge;
BackTrack(2);
for(i=1;i<=n;i++)
cout<<bestx[i]<<' ';
cout<<endl;
cout<<bestc<<endl;
}
return 0;
}
09-13
09-13