#include <bits/stdc++.h>
using namespace std;
const int Max_N(2050);
namespace io {
const int SIZE = (1 << 21) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c,
                                       qu[55];
int f, qr;
inline void flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
inline void putc(char x) {
  *oS++ = x;
  if (oS == oT) flush();
}
template <class I>
inline void gi(I &x) {
  for (f = 1, c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                              (iS == iT ? EOF : *iS++))
                            : *iS++);
       c < '0' || c > '9';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    if (c == '-') f = -1;
  for (x = 0; c <= '9' && c >= '0';
       c = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin),
                       (iS == iT ? EOF : *iS++))
                     : *iS++))
    x = x * 10 + (c & 15);
  x *= f;
}
template <class I>
inline void print(I x) {
  if (!x) putc('0');
  if (x < 0) putc('-'), x = -x;
  while (x) qu[++qr] = x % 10 + '0', x /= 10;
  while (qr) putc(qu[qr--]);
}
struct Flusher_ {
  ~Flusher_() { flush(); }
} io_flusher_;
}  // namespace io
using io::gi;
using io::print;
using io::putc;
int N, M, A, B, P[Max_N], G[Max_N][Max_N], PA[Max_N], PB[Max_N];
long long int DA[Max_N], DB[Max_N], HA[Max_N], HB[Max_N];
bool done[Max_N];
void DIJ(int S, long long int Dist[]) {
  memset(done, false, sizeof(done));
  memset(Dist, 0X3F, sizeof(long long int) * Max_N);
  for (int i = 1; i <= N; ++i) Dist[i] = 0X3F3F3F3F3F3F3F3FLL;
  Dist[S] = 0LL;
  int cnt = 0;
  for (int u;;) {
    u = -1;
    for (int i = 1; i <= N; ++i)
      if (done[i] == false && (u == -1 || Dist[i] < Dist[u])) u = i;
    if (u == -1) break;
    done[u] = true;
    for (int v = 1; v <= N; ++v)
      if (G[u][v] < 0X3F3F3F3F) Dist[v] = min(Dist[v], Dist[u] + G[u][v]);
  }
}
long long int F[Max_N][Max_N][2][2], Sum[Max_N][Max_N][2], All[Max_N][Max_N];
int Cnt[Max_N][Max_N][2];
inline void upd(long long int &a, long long int b) { a = max(a, b); }
int main() {
  gi(N), gi(M);
  gi(A), gi(B);
  for (int u = 1; u <= N; ++u) gi(P[u]);
  memset(G, 0X3F, sizeof(G));
  for (int u, v, w; M--;)
    gi(u), gi(v), gi(w), G[u][v] = min(G[u][v], w), G[v][u] = min(G[v][u], w);
  DIJ(A, DA), DIJ(B, DB);
  for (int u = 1; u <= N; ++u) HA[u] = DA[u], HB[u] = DB[u];
  sort(HA + 1, HA + 1 + N), HA[0] = unique(HA + 1, HA + 1 + N) - (HA + 1);
  sort(HB + 1, HB + 1 + N), HB[0] = unique(HB + 1, HB + 1 + N) - (HB + 1);
  for (int u = 1; u <= N; ++u)
    All[PA[u] = lower_bound(HA + 1, HA + 1 + HA[0], DA[u]) - HA]
       [PB[u] = lower_bound(HB + 1, HB + 1 + HB[0], DB[u]) - HB] += P[u];
  for (int a = 0; a <= HA[0]; ++a)
    for (int u = 1; u <= N; ++u)
      if (PA[u] > a) Sum[a][PB[u]][0] += P[u], Cnt[a][PB[u]][0] = 1;
  for (int b = 0; b <= HB[0]; ++b)
    for (int u = 1; u <= N; ++u)
      if (PB[u] > b) Sum[b][PA[u]][1] += P[u], Cnt[b][PA[u]][1] = 1;
  for (int x = HA[0]; x >= 0; --x)
    for (int y = HB[0]; y >= 0; --y)
      All[x][y] += All[x + 1][y] + All[x][y + 1] - All[x + 1][y + 1];
  for (int x = HA[0]; x >= 0; --x)
    for (int y = HB[0]; y >= 0; --y) {
      for (int c = 0; c <= 1; ++c)
        F[x][y][0][c] = F[x][y][1][c] = All[x + 1][y + 1];
      if (x + 1 <= HA[0])
        for (int c = 0; c <= 1; ++c)
          upd(F[x][y][0][c],
              Sum[y][x + 1][1] + F[x + 1][y][0][c | Cnt[y][x + 1][1]]);
      if (y + 1 <= HB[0])
        for (int c = 0; c <= 1; ++c)
          upd(F[x][y][1][c],
              Sum[x][y + 1][0] + F[x][y + 1][1][c | Cnt[x][y + 1][0]]);
      upd(F[x][y][0][1], -F[x][y][1][0]);
      upd(F[x][y][1][1], -F[x][y][0][0]);
    }
  if (F[0][0][0][0] > 0LL)
    puts("Break a heart");
  else if (F[0][0][0][0] < 0LL)
    puts("Cry");
  else
    puts("Flowers");
  return 0;
}
