/*
一个最短路问题, 不过附加了额外的条件 需要判断这条路等多久才可以通行。
*/
#include<cstdio>
#include<cstring>#include<vector>
#include<queue>
#define INF 1<<30
using namespace std;
struct Edge
{
int from,to,dist;
};
struct Node
{
int u,c;
int rt;
int tb,tp;
int time;
bool operator < (const Node&a) const
{
return time>a.time;
}
} a[333];
vector<Edge> edges;
vector<int> G[333];
int s,t,n,m,d[333],p[333];
bool vis[333],flag;
int add(int x,int y,int z)
{
edges.push_back((Edge)
{
x,y,z
});
int l = edges.size();
G[x].push_back(l-1);
}
int judge(Node &p,Node &q,int te,int cur)
{
if(cur==5)
{
flag=1;
return 0;
}
if(p.c!=q.c)
{
if(p.rt<q.rt)
{
int sb = p.c==1?p.tp:p.tb;
int zb = q.c==1?q.tp:q.tb;
q.rt-=p.rt;
q.time+=p.rt;
p.time += p.rt;
p.rt = sb;
p.c = -p.c;
if(p.c==q.c)
return 0;
judge(p,q,te,cur+1);
}
else if(p.rt>q.rt)
{
int sb = p.c==1?p.tp:p.tb;
int zb = q.c==1?q.tp:q.tb;
p.rt-=q.rt;
p.time+=q.rt;
q.time += q.rt;
q.rt = zb;
q.c = -q.c;
if(p.c==q.c)
return 0;
judge(p,q,te,cur+1);
}
else if(p.rt==q.rt)
{
int ts = p.rt;
//p.rt = q.rt = 0;
p.time += ts;
q.time += ts;
int sb = p.c==1?p.tp:p.tb;
p.rt = sb;
sb = q.c==1?q.tp:q.tb;
q.rt = sb;
p.c=-p.c;
q.c=-q.c;
judge(p,q,te,cur+1);
}
}
}
int get_time(Node &x,Node &y,int te)
{
if(x.c==y.c)
return 0;
Node p=x,q=y;
int b1,b2; //B P
b1=x.rt+x.tp+x.tb;
b2=y.rt+y.tp+y.tb;
if(b1==b2)
return -1;
judge(p,q,te,0);
if(flag) return -1;
int temp = p.time-te;
y = q;
x = p;
return temp;
}
int change_time(Node &p,int t)
{
int pt = t;
int st = p.rt;
while(1)
{
int sb = p.c==1?p.tp:p.tb;
if(pt>=st)
{
pt-=st;
st=p.rt=sb;
p.c=-p.c;
}
else
{
p.rt -= pt;
pt=0;
}
if(pt==0)
return 0;
}
return 0;
}
int bfs()
{
for(int i = 0; i <= n; i++)
d[i] = INF;
d[s] = 0;
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
priority_queue<Node> q;
q.push((Node)
{
s,a[s].c,a[s].rt,a[s].tb,a[s].tp,0
});
Node next,tmp;
while(!q.empty())
{
Node now = q.top();
tmp=now;
q.pop();
int u = now.u;
if(u==t) return d[u];
if(vis[u]) continue;
vis[u] = 1;
for(int i = 0; i < G[u].size(); i++)
{
Edge &e = edges[G[u][i]];
int v = e.to;
tmp=now;
next=(Node)
{
v,a[v].c,a[v].rt,a[v].tb,a[v].tp,now.time
};
change_time(next,now.time);
int tp = get_time(tmp,next,now.time);
if(tp==-1) continue;
if(d[v]>d[u]+e.dist+tp)
{
d[v]=d[u]+e.dist+tp;
next.time = d[v];
change_time(next,e.dist);
p[v] = u;
q.push(next);
}
}
}
return -1;
}
int main()
{
int x,y,z;
char s1[10];
while(scanf("%d%d",&s,&t)==2)
{
scanf("%d%d",&n,&m);
edges.clear();
for(int i = 0; i <= n; i++)
G[i].clear();
for(int i = 1; i <= n; i++)
{
scanf("%s%d%d%d",s1,&x,&y,&z);
if(s1[0]=='B')
{
a[i].c = 1;
a[i].rt = x;
a[i].tb = y;
a[i].tp = z;
}
else
{
a[i].c = -1;
a[i].rt = x;
a[i].tb = y;
a[i].tp = z;
}
}
for(int i = 0; i < m; i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
int res = bfs();
if(res==-1)
printf("0\n");
else
{
printf("%d\n",res);
int l=0,pu[444];
for(int u = t; u!=s; u=p[u])
pu[l++] = u;
printf("%d",s);
for(int i = l-1; i>=0; i--)
printf(" %d",pu[i]);
printf("\n");
}
}
return 0;
}