#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<map>
#include<set>
#include<stack>
#define bug printf("*********\n");
#define mem0(a) memset(a, 0, sizeof(a));
#define mem1(a) memset(a, -1, sizeof(a));
#define finf(a, n) fill(a, a+n, INF);
#define in1(a) scanf("%d" ,&a);
#define in2(a, b) scanf("%d%d", &a, &b);
#define in3(a, b, c) scanf("%d%d%d", &a, &b, &c);
#define out1(a) printf("%d\n", a);
#define out2(a, b) printf("%d %d\n", a, b);
#define pb(G, a, b) G[a].push_back(b);
using namespace std;
typedef long long LL;
typedef pair<LL, pair<int, LL> > LLppar;
typedef pair<int, int> par;
typedef pair<LL, int> LLpar;
const int mod = 998244353;
const int INF = 1e9+7;
const int N = 1010;
const double pi = 3.1415926;
int n, m, cnt1, cnt2;
int head1[110], head2[110], ve[110], vl[110], e[110], l[110], thing[110];
struct edge
{
int to;
int cost;
int next;
}e1[110], e2[110];
void add1(int u, int v, int w)
{
e1[cnt1].to = v;
e1[cnt1].cost = w;
e1[cnt1].next = head1[u];
head1[u] = cnt1 ++;
}
void add2(int u, int v, int w)
{
e2[cnt2].to = v;
e2[cnt2].cost = w;
e2[cnt2].next = head2[u];
head2[u] = cnt2 ++;
}
void dfs_ve(int k)
{
for(int i = head1[k]; i != -1; i = e1[i].next) {
int en = e1[i].to;
ve[en] = max(ve[en], ve[k] + e1[i].cost);
dfs_ve(en);
}
}
void dfs_vl(int k)
{
for(int i = head2[k]; i != -1; i = e2[i].next) {
int en = e2[i].to;
vl[en] = min(vl[en], vl[k] - e2[i].cost);
dfs_vl(en);
}
}
void print()
{
printf("ve[] :");
for(int i = 0; i < n; i ++) {
printf("%d ", ve[i]);
}
printf("\n");
printf("vl[]:");
for(int i = 0; i < n; i ++) {
printf("%d ", vl[i]);
}
printf("\n");
printf("e[]:");
for(int i = 0; i < m; i ++) {
printf("%d ", e[i]);
}
printf("\n");
printf("l[]:");
for(int i = 0; i < m; i++) {
printf("%d ", l[i]);
}
printf("\n");
}
int main()
{
int x, y, z;
while(~scanf("%d%d", &n, &m)) {
cnt1 = cnt2 = 0;
mem1(head1);
mem1(head2);
finf(vl, n);
mem0(ve);
for(int i = 0; i < m; i ++) {
scanf("%d%d%d", &x, &y, &z);
add1(x, y, z);
add2(y, x, z);
}
dfs_ve(0);
vl[n-1] = ve[n-1];
dfs_vl(n-1);
int sum = 0;
for(int i = 0; i < n; i ++) {
for(int j = head1[i]; j != -1; j = e1[j].next) {
e[j] = ve[i];
l[j] = vl[e1[j].to] - e1[j].cost;
if(e[j] == l[j]) thing[sum ++] = j;
}
}
print();
printf("关键路径:%d\n", ve[n-1]);
printf("关键活动:");
for(int i = 0; i < sum; i ++) {
printf("%d ", thing[i]);
}
printf("\n");
}
return 0;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>
#include<stdlib.h>
#include<queue>
#include<map>
#include<set>
#include<stack>
#define bug printf("*********\n");
#define mem0(a) memset(a, 0, sizeof(a));
#define mem1(a) memset(a, -1, sizeof(a));
#define finf(a, n) fill(a, a+n, INF);
#define in1(a) scanf("%d" ,&a);
#define in2(a, b) scanf("%d%d", &a, &b);
#define in3(a, b, c) scanf("%d%d%d", &a, &b, &c);
#define out1(a) printf("%d\n", a);
#define out2(a, b) printf("%d %d\n", a, b);
#define pb(G, a, b) G[a].push_back(b);
using namespace std;
typedef long long LL;
typedef pair<LL, pair<int, LL> > LLppar;
typedef pair<int, int> par;
typedef pair<LL, int> LLpar;
const int mod = 998244353;
const int INF = 1e9+7;
const int N = 1010;
const double pi = 3.1415926;
int n, m, way[110][110], path[110][110];
int main()
{
int x, y, z, a[110];
while(~scanf("%d%d", &n, &m)) {
if(n == 0 && m == 0) break;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= n; j ++) {
if(i == j) way[i][j] = way[j][i] = 0;
else way[i][j] = INF;
path[i][j] = i;
}
}
for(int i = 0; i < m; i ++) {
scanf("%d%d%d", &x, &y, &z);
way[x][y] = way[y][x] = min(way[x][y], z);
}
for(int k = 1; k <= n; k ++) {
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= n; j ++) {
if(way[i][j] > way[i][k] + way[k][j]) {
way[i][j] = way[i][k] + way[k][j];
path[i][j] = path[k][j];
}
}
}
}
printf("%d\n", way[1][n]);
int sum = 0, pre = n;
a[sum ++] = n;
while(path[1][pre] != 1) {
pre = path[1][pre];
a[sum ++] = pre;
}
a[sum] = 1;
for(int i = sum; i >= 0; i --) {
printf("%d ", a[i]);
}
printf("\n");
}
return 0;
}