#include <bits/stdc++.h>
using namespace std;
const int N = 2000 + 10, M = 1e5 + 10;
int rd() {
  int x = 0, w = 1;
  char ch = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * w;
}
int to[M << 1], nt[M << 1], w[M << 1], hd[N], tot = 1;
void adde(int x, int y, int z) {
  ++tot, to[tot] = y, nt[tot] = hd[x], w[tot] = z, hd[x] = tot;
  ++tot, to[tot] = x, nt[tot] = hd[y], w[tot] = z, hd[y] = tot;
}
int n, m, x1, x2, s1[N], s2[N], ps[N], t1[N], t2[N], cn[N][N];
long long f[N][N], g[N][N], fm[N], gm[N], fb[N], gb[N], sm[N][N], va[N];
struct node {
  long long x, d;
  bool operator<(const node &bb) const { return d > bb.d; }
};
priority_queue<node> q;
long long d1[N], d2[N];
bool cmp1(int aa, int bb) { return d1[aa] < d1[bb]; }
bool cmp2(int aa, int bb) { return d2[aa] < d2[bb]; }
void dij(long long *di, int sta) {
  memset(di, 0x3f3f3f, sizeof(long long) * (n + 1));
  q.push((node){sta, di[sta] = 0});
  while (!q.empty()) {
    int x = q.top().x;
    long long d = q.top().d;
    q.pop();
    if (d > di[x]) continue;
    for (int i = hd[x]; i; i = nt[i]) {
      int y = to[i];
      if (di[y] > di[x] + w[i]) q.push((node){y, di[y] = di[x] + w[i]});
    }
  }
}
int main() {
  n = rd(), m = rd();
  x1 = rd(), x2 = rd();
  for (int i = 1; i <= n; ++i) va[i] = rd();
  for (int i = 1; i <= m; ++i) {
    int x = rd(), y = rd(), z = rd();
    adde(x, y, z);
  }
  dij(d1, x1);
  for (int i = 1; i <= n; ++i) s1[i] = i;
  sort(s1 + 1, s1 + n + 1, cmp1);
  dij(d2, x2);
  for (int i = 1; i <= n; ++i) s2[i] = i;
  sort(s2 + 1, s2 + n + 1, cmp2);
  for (int i = 1; i <= n; ++i) ps[s2[i]] = i;
  for (int i = 1; i <= n; ++i) t1[i] = ps[s1[i]];
  for (int i = 1; i <= n; ++i) ps[s1[i]] = i;
  for (int i = 1; i <= n; ++i) t2[i] = ps[s2[i]];
  for (int i = 1; i <= n; ++i)
    sm[i][0] = sm[i - 1][0] + va[s1[i]], cn[i][0] = cn[i - 1][0] + 1;
  for (int j = 1; j <= n; ++j)
    for (int i = 0; i <= n; ++i)
      sm[i][j] = sm[i][j - 1] + (t2[j] > i ? va[s2[j]] : 0),
      cn[i][j] = cn[i][j - 1] + (t2[j] > i ? 1 : 0);
  memset(fm, 0x3f3f3f, sizeof(fm)), memset(fb, 0x3f3f3f, sizeof(fb));
  memset(gm, 0x3f3f3f, sizeof(gm)), memset(gb, 0x3f3f3f, sizeof(gb));
  for (int h = n + n; ~h; --h)
    for (int i = 0, j = h; ~j; ++i, --j) {
      if (i < 0 || i > n || j < 0 || j > n) continue;
      if (cn[i][j] == n) {
        f[i][j] = g[i][j] = 0;
        fm[j] = min(fm[j], 0ll), gm[i] = min(gm[i], 0ll);
        continue;
      }
      if (cn[i][j] < cn[i + 1][j]) fm[j] = min(fm[j], fb[j]), fb[j] = fb[n + 1];
      f[i][j] = sm[n][n] - sm[i][j] - fm[j];
      if (cn[i][j] < cn[i][j + 1]) gm[i] = min(gm[i], gb[i]), gb[i] = gb[n + 1];
      g[i][j] = sm[n][n] - sm[i][j] - gm[i];
      if (f[i][j] > -(1ll << 45)) gb[i] = min(gb[i], f[i][j]);
      if (g[i][j] > -(1ll << 45)) fb[j] = min(fb[j], g[i][j]);
    }
  if (f[0][0] < sm[n][n] - f[0][0])
    puts("Cry");
  else if (f[0][0] > sm[n][n] - f[0][0])
    puts("Break a heart");
  else
    puts("Flowers");
  return 0;
}
