#include <bits/stdc++.h>
using namespace std;
int gi() {
  int res = 0, w = 1;
  char ch = getchar();
  while (ch != '-' && !isdigit(ch)) ch = getchar();
  if (ch == '-') w = -1, ch = getchar();
  while (isdigit(ch)) res = res * 10 + ch - '0', ch = getchar();
  return res * w;
}
using LL = long long;
const LL INF = 1e15;
const int MAX_N = 2e3 + 5, MAX_M = 1e5 + 5;
struct Graph {
  int to, cost, next;
} e[MAX_M << 1];
int fir[MAX_N], e_cnt;
void clearGraph() {
  memset(fir, -1, sizeof(fir));
  e_cnt = 0;
}
void Add_Edge(int u, int v, int w) {
  e[e_cnt] = (Graph){v, w, fir[u]}, fir[u] = e_cnt++;
}
int N, M, S, T, a[MAX_N];
bool vis[MAX_N];
LL d1[MAX_N], d2[MAX_N], o1[MAX_N], o2[MAX_N];
int cnt1, cnt2;
void dijkstra(int s, LL dis[]) {
  for (int i = 1; i <= N; i++) dis[i] = INF, vis[i] = 0;
  dis[s] = 0;
  while (1) {
    int x = 0;
    for (int i = 1; i <= N; i++)
      if (!vis[i] && (!x || dis[i] < dis[x])) x = i;
    if (!x) break;
    vis[x] = 1;
    for (int i = fir[x]; ~i; i = e[i].next) {
      int v = e[i].to, w = e[i].cost;
      if (dis[x] + w < dis[v]) dis[v] = dis[x] + w;
    }
  }
}
int cnt[MAX_N][MAX_N];
LL f[2][MAX_N][MAX_N], sum[MAX_N][MAX_N];
int pre1[MAX_N][MAX_N], pre2[MAX_N][MAX_N];
int main() {
  clearGraph();
  N = gi(), M = gi(), S = gi(), T = gi();
  for (int i = 1; i <= N; i++) a[i] = gi();
  for (int i = 1; i <= M; i++) {
    int u = gi(), v = gi(), w = gi();
    Add_Edge(u, v, w), Add_Edge(v, u, w);
  }
  dijkstra(S, d1), dijkstra(T, d2);
  for (int i = 1; i <= N; i++) o1[i] = d1[i], o2[i] = d2[i];
  sort(&o1[1], &o1[N + 1]);
  cnt1 = unique(&o1[1], &o1[N + 1]) - o1 - 1;
  sort(&o2[1], &o2[N + 1]);
  cnt2 = unique(&o2[1], &o2[N + 1]) - o2 - 1;
  for (int i = 1; i <= N; i++) {
    d1[i] = lower_bound(&o1[1], &o1[cnt1 + 1], d1[i]) - o1;
    d2[i] = lower_bound(&o2[1], &o2[cnt2 + 1], d2[i]) - o2;
  }
  for (int i = 1; i <= N; i++) cnt[d1[i]][d2[i]]++, sum[d1[i]][d2[i]] += a[i];
  for (int i = cnt1; i; i--)
    for (int j = cnt2; j; j--) {
      sum[i][j] += sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1];
      pre1[i][j] = min(i == cnt1 ? i : pre1[i + 1][j],
                       j == cnt2 ? cnt1 : pre1[i][j + 1]);
      pre2[i][j] = min(i == cnt1 ? cnt2 : pre2[i + 1][j],
                       j == cnt2 ? j : pre2[i][j + 1]);
      if (cnt[i][j]) pre1[i][j] = i, pre2[i][j] = j;
      f[0][i][j] = sum[i][j] - f[1][pre1[i][j] + 1][j];
      f[1][i][j] = sum[i][j] - f[0][i][pre2[i][j] + 1];
      if (i == 1 && j == 1) break;
      f[0][i][j] = min(f[0][i][j], f[0][i][j + 1]);
      f[1][i][j] = min(f[1][i][j], f[1][i + 1][j]);
    }
  LL ans = sum[1][1] - 2 * f[0][1][1];
  puts(ans < 0 ? "Break a heart" : (ans > 0 ? "Cry" : "Flowers"));
  return 0;
}
