//未使用优先队列,时间复杂度为O(v*v)
//dijkstra algorithm
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int INF=100000;
const int maxn=200+5;
int G[maxn][maxn];
bool done[maxn];
int d[maxn];
int parent[maxn]; //路径
int v,e;
void dijkstra()
{
memset(done,false,sizeof(done));
for(int i=1;i<=v;i++)
d[i]=(i==1?0:INF);
for(int i=1;i<=v;i++)
{
int x,m=INF;
for(int y=1;y<=v;y++)
if(!done[y]&&d[y]<=m) m=d[x=y];
done[x]=true;
for(int y=1;y<=v;y++)
if(d[y]>d[x]+G[x][y])
{
d[y]=d[x]+G[x][y];
parent[y]=x;
}
}
}
int main()
{
while(scanf("%d%d",&v,&e)==2&&v)
{
for(int i=1;i<=v;i++)
for(int j=1;j<=v;j++)
if(i==j) G[i][j]=0;
else G[i][j]=INF;
for(int i=0;i<e;i++)
{
int v1,v2,dist;
scanf("%d%d%d",&v1,&v2,&dist);
if(G[v1][v2]>dist) G[v1][v2]=dist;
//避免重边的情况
}
dijkstra();
int end;
while(scanf("%d",&end)==1&&end>=1&&end<=v)
{
if(d[end]>=INF) printf("No path.\n");
else {
printf("%d\n",d[end]);
stack<int>path;
int x=end;
while(x!=1)
{
path.push(x);
x=parent[x];
}
path.push(1);
while(!path.empty())
{
printf("%d ",path.top());
path.pop();
}
printf("\n");
}
}
}
return 0;
}
//dijkstra algorithm
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int INF=100000;
const int maxn=200+5;
int G[maxn][maxn];
bool done[maxn];
int d[maxn];
int parent[maxn]; //路径
int v,e;
void dijkstra()
{
memset(done,false,sizeof(done));
for(int i=1;i<=v;i++)
d[i]=(i==1?0:INF);
for(int i=1;i<=v;i++)
{
int x,m=INF;
for(int y=1;y<=v;y++)
if(!done[y]&&d[y]<=m) m=d[x=y];
done[x]=true;
for(int y=1;y<=v;y++)
if(d[y]>d[x]+G[x][y])
{
d[y]=d[x]+G[x][y];
parent[y]=x;
}
}
}
int main()
{
while(scanf("%d%d",&v,&e)==2&&v)
{
for(int i=1;i<=v;i++)
for(int j=1;j<=v;j++)
if(i==j) G[i][j]=0;
else G[i][j]=INF;
for(int i=0;i<e;i++)
{
int v1,v2,dist;
scanf("%d%d%d",&v1,&v2,&dist);
if(G[v1][v2]>dist) G[v1][v2]=dist;
//避免重边的情况
}
dijkstra();
int end;
while(scanf("%d",&end)==1&&end>=1&&end<=v)
{
if(d[end]>=INF) printf("No path.\n");
else {
printf("%d\n",d[end]);
stack<int>path;
int x=end;
while(x!=1)
{
path.push(x);
x=parent[x];
}
path.push(1);
while(!path.empty())
{
printf("%d ",path.top());
path.pop();
}
printf("\n");
}
}
}
return 0;
}