#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=s*10+(ch-'0'),ch=getchar();
return s*w;
}
const int MAXN(510);
const int MAXM(4010);
int n,s,t;
int m,k;
struct E{int to,nxt,cost;};
E edge[MAXM];
struct node{int from,to,cost;};
node link[MAXM];
int head[MAXN],tot;
inline void add_edge(int u,int v,int w)
{
edge[++tot].nxt=head[u];
head[u]=tot;
edge[tot].to=v;
edge[tot].cost=w;
return;
}
int d1[MAXN],d2[MAXN];
int par1[MAXN],par2[MAXN];
vector<int>path[MAXN];
int geton[MAXN],dist[MAXN];
int test;
typedef pair<int,int> P;
priority_queue<P,vector<P>,greater<P> >q;
inline void dijkstra(int s,int*d,int*par)
{
for(register int i=1;i<=n;i++) d[i]=1e9;
d[s]=0;
q.push(make_pair(0,s));
while(!q.empty())
{
P p=q.top();
q.pop();
int v=p.second;
if(d[v]<p.first) continue;
for(register int i=head[v];i;i=edge[i].nxt)
{
E e=edge[i];
if(d[e.to]>d[v]+e.cost)
{
d[e.to]=d[v]+e.cost;
q.push(make_pair(d[e.to],e.to));
par[e.to]=v;
}
}
}
return;
}
int now[MAXN];
inline void init_()
{
mem(par1);
mem(par2);
mem(head);
mem(edge);
mem(link);
mem(now);
tot=0;
return;
}
inline void solve()
{
init_();
++test;
m=read();
while(m--)
{
int u=read(),v=read(),w=read();
add_edge(u,v,w);
add_edge(v,u,w);
}
k=read();
for(register int i=1;i<=k;i+=2)
{
link[i].from=read(),link[i].to=read(),link[i].cost=read();
link[i+1].from=link[i].to,link[i+1].to=link[i].from,link[i+1].cost=link[i].cost;
}
dijkstra(s,d1,par1);
dijkstra(t,d2,par2);
int pth=0,minn=d1[n];
for(register int i=1;i<=(k<<1);i++)
{
int w=d1[link[i].from]+link[i].cost+d2[link[i].to];
if(minn>w) minn=w,pth=i;
}
if(pth==0)
{
int tmp=0;
for(register int i=link[pth].from;i;i=par1[i])
now[++tmp]=i;
for(register int i=tmp;i>=1;i--) path[test].push_back(now[i]);
dist[test]=d1[n];
geton[test]=114514;
}
else
{
int tmp=0;
for(register int i=link[pth].from;i;i=par1[i])
now[++tmp]=i;
for(register int i=tmp;i>=1;i--) path[test].push_back(now[i]);
for(register int i=link[pth].to;i;i=par2[i]) path[test].push_back(i);
dist[test]=minn;
geton[test]=link[pth].from;
}
return;
}
int main()
{
while(scanf("%d%d%d",&n,&s,&t)!=EOF) solve();
for(register int i=1;i<=test;i++)
{
for(register int j=0;j<path[i].size()-1;j++) printf("%d ",path[i][j]);
printf("%d\n",path[i][path[i].size()-1]);
if(geton[i]==114514) puts("Ticket Not Used");
else printf("%d\n",geton[i]);
if(test==i) printf("%d",dist[i]);
else printf("%d\n\n",dist[i]);
}
return 0;
}