#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
const long long INF = 0x3f3f3f3f3f3f3f3fll;
struct Node {
  int v, num;
  long long c1, c2;
  Node *nxt;
} pool[N * 2], *tail = pool, *g[N];
int n, m, K, s1, s2, f;
int T[N * 2];
long long d[N];
bool inq[N];
inline void make_edge(int num, int u, int v, int l, int r) {
  tail->num = num;
  tail->v = v;
  tail->c1 = l << 1;
  tail->c2 = r << 1;
  T[num] = l;
  tail->nxt = g[u];
  g[u] = tail++;
}
inline bool ckmin(long long &a, long long b) { return b < a ? a = b, 1 : 0; }
inline bool chk(int s1, int s2, int t) {
  queue<int> q;
  for (int i = 1; i <= n; i++) d[i] = INF;
  d[s1] = 1;
  d[s2] = 0;
  inq[s1] = inq[s2] = 1;
  q.push(s1);
  q.push(s2);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    inq[u] = 0;
    for (Node *p = g[u]; p; p = p->nxt) {
      int c = (d[u] & 1) == t ? p->c1 : p->c2;
      T[p->num] = c / 2;
      if (ckmin(d[p->v], d[u] + c) && !inq[p->v]) inq[p->v] = 1, q.push(p->v);
    }
  }
  return (d[f] & 1) == t;
}
int main() {
  scanf("%d%d%d%d%d%d", &n, &m, &K, &s1, &s2, &f);
  for (int i = 1; i <= m; i++) {
    int u, v, c;
    scanf("%d%d%d", &u, &v, &c);
    make_edge(i, u, v, c, c);
  }
  for (int i = 1; i <= K; i++) {
    int u, v, l, r;
    scanf("%d%d%d%d", &u, &v, &l, &r);
    make_edge(i + m, u, v, l, r);
  }
  if (chk(s1, s2, 1)) {
    puts("WIN");
    for (int i = 1; i <= K; i++) printf("%d ", T[m + i]);
    puts("");
  } else if (chk(s2, s1, 0)) {
    puts("DRAW");
    for (int i = 1; i <= K; i++) printf("%d ", T[m + i]);
    puts("");
  } else
    puts("LOSE");
  return 0;
}
