#include <cstdio> #include <cstdlib> #include <string> #include <algorithm> #include <vector> #include <list> using namespace std; const int N = 10001; const int INF = 2000000001; class Edge { public: int name; int to; int value; Edge(int name1 = 0, int to1 = 0, int val1 = 0):name(name1), to(to1), value(val1){} }; // adj List of Graph list<Edge> v[N]; bool vis[N]; // cur is the array of current edges, sumCur is the sum of cur array // best is the currently the best solution int best[N]; int sumBest = INF; int cur[N]; int sumCur = 0; // start vertex int start; // number of vertexs int n; int getStart() { for(int i = 0; i < N; i++) { if(!v[i].empty()) { return i; } } } void dfs(int s, int length) { //printf("enter visiting %d\n", s); list<Edge> es = v[s]; list<Edge>::iterator it; for(it = es.begin(); it != es.end(); it++) { int t = it->to; if(t == start && length == n) { // printf("find a solution\n"); // find a solution if(sumCur + it->value < sumBest) { sumBest = sumCur + it->value; cur[length] = it->name; copy(cur, cur+N, best); } return; } else { if(!vis[t]) { //printf("=> %d\n", t); vis[t] = true; sumCur += it->value; cur[length] = it->name; dfs(t, length+1); sumCur -= it->value; vis[t] = false; //printf("<= %d\n", t); } } } //printf("exit visiting %d\n", s); } void solve() { start = getStart(); vis[start] = true; dfs(start, 1); printf("%d\n", sumBest); sort(best+start, best+n+1); for(int i = start; i <= n; i++) { printf("%d ", best[i]); } printf("\n"); } void init() { char m[10]; char s[10]; char t[10]; int val; while(scanf("%s%s%s%d", m, s, t, &val) != EOF) { //printf("%s %s %s %d\n", m, s, t, val); string sm(m); string ss(s); string st(t); int im, is, it; im = atoi(sm.substr(1).c_str()); is = atoi(ss.substr(1).c_str()); it = atoi(st.substr(1).c_str()); Edge e(im, it, val); v[is].push_front(e); } for(int i = 0; i < N; i++) { if(!v[i].empty()) { n++; } } /* print the graph for(int i = 0; i < N; i++) { if(!v[i].empty()) { list<Edge> es = v[i]; list<Edge>::iterator it; for(it = es.begin(); it != es.end(); it++) { printf("%d %d %d\n", i, it->to, it->value); } } } */ } int main() { init(); solve(); return 0; }