#include <bits/stdc++.h>
using namespace std;
const int RLEN = 1 << 20 | 1;
inline char gc() {
  static char ibuf[RLEN], *ib, *ob;
  (ib == ob) && (ob = (ib = ibuf) + fread(ibuf, 1, RLEN, stdin));
  return (ib == ob) ? EOF : *ib++;
}
inline int read() {
  char ch = gc();
  int res = 0;
  bool f = 1;
  while (!isdigit(ch)) f ^= ch == '-', ch = gc();
  while (isdigit(ch)) res = (res + (res << 2) << 1) + (ch ^ 48), ch = gc();
  return f ? res : -res;
}
inline long long readll() {
  char ch = gc();
  long long res = 0;
  bool f = 1;
  while (!isdigit(ch)) f ^= ch == '-', ch = gc();
  while (isdigit(ch)) res = (res + (res << 2) << 1) + (ch ^ 48), ch = gc();
  return f ? res : -res;
}
inline int readstring(char *s) {
  int top = 0;
  char ch = gc();
  while (isspace(ch)) ch = gc();
  while (!isspace(ch) && ch != EOF) s[++top] = ch, ch = gc();
  return top;
}
template <typename tp>
inline void chemx(tp &a, tp b) {
  a < b ? a = b : 0;
}
template <typename tp>
inline void chemn(tp &a, tp b) {
  a > b ? a = b : 0;
}
namespace Module {
const int mod = 998244353;
inline int add(int a, int b) {
  return (a + b >= mod) ? (a + b - mod) : (a + b);
}
inline int dec(int a, int b) { return (a < b) ? (a - b + mod) : (a - b); }
inline int mul(int a, int b) {
  static long long r;
  r = 1ll * a * b;
  return (r >= mod) ? (r % mod) : r;
}
inline void Add(int &a, int b) { a = (a + b >= mod) ? (a + b - mod) : (a + b); }
inline void Dec(int &a, int b) { a = (a < b) ? (a - b + mod) : (a - b); }
inline void Mul(int a, int b) {
  static long long r;
  r = 1ll * a * b;
  a = (r >= mod) ? (r % mod) : r;
}
inline int ksm(int a, int b, int res = 1) {
  for (; b; b >>= 1, Mul(a, a)) (b & 1) && (Mul(res, a), 1);
  return res;
}
inline int Inv(int x) { return ksm(x, mod - 2); }
inline int fix(long long x) {
  x %= mod, (x < 0) && (x += mod);
  return x;
}
}  // namespace Module
const int N = 2005, M = 100005;
int n, m, x[N], y[N], S, T, p[N], ln, lm;
long long dis[N], b[N], s[N][N], mx[N][N], my[N][N], f[2][N][N];
bool vis[N], hv[N][N];
priority_queue<pair<long long, int>, vector<pair<long long, int> >,
               greater<pair<long long, int> > >
    q;
vector<pair<int, int> > e[N];
inline void dijkstra(int *tmp, int &l, int st) {
  memset(dis, 127 / 3, sizeof(dis));
  memset(vis, 0, sizeof(vis));
  dis[st] = 0, q.push(pair<long long, int>(0, st));
  while (!q.empty()) {
    int u = q.top().second;
    q.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (pair<int, int> &x : e[u])
      if (dis[x.first] > dis[u] + x.second) {
        dis[x.first] = dis[u] + x.second;
        q.push(pair<long long, int>(dis[x.first], x.first));
      }
  }
  for (int i = 1; i <= n; i++) b[i] = dis[i];
  sort(b + 1, b + n + 1);
  l = unique(b + 1, b + n + 1) - b - 1;
  for (int i = 1; i <= n; i++)
    tmp[i] = lower_bound(b + 1, b + l + 1, dis[i]) - b;
}
int main() {
  n = read(), m = read();
  S = read(), T = read();
  for (int i = 1; i <= n; i++) p[i] = read();
  for (int i = 1; i <= m; i++) {
    int u = read(), v = read(), w = read();
    e[u].push_back(pair<int, int>(v, w)), e[v].push_back(pair<int, int>(u, w));
  }
  dijkstra(x, ln, S), dijkstra(y, lm, T);
  for (int i = 1; i <= n; i++) hv[x[i]][y[i]] = 1, s[x[i]][y[i]] += p[i];
  for (int i = ln; i; i--)
    for (int j = lm; j; j--) {
      s[i][j] += s[i + 1][j] + s[i][j + 1] - s[i + 1][j + 1];
      if (!hv[i][j])
        mx[i][j] =
            min(i == ln ? ln : mx[i + 1][j], j == lm ? ln : mx[i][j + 1]),
        my[i][j] =
            min(i == ln ? lm : my[i + 1][j], j == lm ? lm : my[i][j + 1]);
      else
        mx[i][j] = i, my[i][j] = j;
      f[0][i][j] = s[i][j] - f[1][mx[i][j] + 1][j];
      f[1][i][j] = s[i][j] - f[0][i][my[i][j] + 1];
      if (i == 1 && j == 1) continue;
      chemn(f[0][i][j], f[0][i][j + 1]), chemn(f[1][i][j], f[1][i + 1][j]);
    }
  long long v1 = f[0][1][1], v2 = s[1][1] - f[0][1][1];
  if (v1 < v2) puts("Cry");
  if (v1 > v2) puts("Break a heart");
  if (v1 == v2) puts("Flowers");
  return 0;
}
