#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
struct edge {
  int from, to, next, v, v2;
} e[N * 2];
int head[N], tot, tp[N];
int n, m, K, S1, S2, T;
bool vis[N];
long long dis[N];
priority_queue<pair<long long, long long> > Q;
void add(int x, int y, int v, int v2) {
  e[++tot] = (edge){x, y, head[x], v, v2};
  head[x] = tot;
}
bool upd(int x, long long d, int fl) {
  if (d > dis[x] || (d == dis[x] && (fl | tp[x]) == tp[x])) return 0;
  if (d == dis[x])
    tp[x] |= fl;
  else
    dis[x] = d, tp[x] = fl;
  Q.push(pair<long long, long long>(-dis[x], x));
  return 1;
}
int main() {
  scanf("%d%d%d%d%d%d", &n, &m, &K, &S1, &S2, &T);
  for (int i = (1); i <= (int)m; i++) {
    int x, y, v;
    scanf("%d%d%d", &x, &y, &v);
    add(x, y, v, 0);
  }
  for (int i = (1); i <= (int)K; i++) {
    int x, y, v1, v2;
    scanf("%d%d%d%d", &x, &y, &v1, &v2);
    add(x, y, v1, v2);
  }
  for (int i = (1); i <= (int)n; i++) dis[i] = 1e18;
  upd(S1, 0, 1);
  upd(S2, 0, 2);
  while (!Q.empty()) {
    int x = Q.top().second;
    Q.pop();
    if (vis[x]) continue;
    vis[x] = 1;
    for (int i = head[x]; i; i = e[i].next) {
      long long trans = dis[x] + (i > m && tp[x] & 2 ? e[i].v2 : e[i].v);
      upd(e[i].to, trans, tp[x]);
    }
  }
  if (tp[T] == 1) puts("WIN");
  if (tp[T] == 2) puts("LOSE");
  if (tp[T] == 3) puts("DRAW");
  if (tp[T] != 2) {
    for (int i = (m + 1); i <= (int)m + K; i++)
      if (tp[e[i].from] / 2)
        printf("%d ", e[i].v2);
      else
        printf("%d ", e[i].v);
  }
}
