#include <bits/stdc++.h>
using namespace std;
const int maxn = 2002, Tavas = 0, Nafas = 1;
vector<tuple<int, int>> nxt[maxn];
int n, m, u, v, w, pos[2], cnt[2], dis[2][maxn], val[maxn];
long long dp[2][maxn][maxn], sum[maxn][maxn], siz[maxn][maxn];
priority_queue<tuple<long long, int>, vector<tuple<long long, int>>,
               greater<tuple<long long, int>>>
    que;
void dijkstra(int source, int& count, int* distance) {
  static int vis[maxn];
  static long long d, dis[maxn], buf[maxn], *tmp = buf + 1;
  for (int i = 1; i <= n; i++) dis[i] = INT64_MAX, vis[i] = 0;
  que.push(tie(dis[source] = 0, source));
  while (!que.empty()) {
    tie(d, u) = que.top(), que.pop();
    if (vis[u]++) continue;
    for (auto t : nxt[u])
      if (tie(v, w) = t, dis[v] > dis[u] + w)
        que.push(tie(dis[v] = dis[u] + w, v));
  }
  for (int i = 1; i <= n; i++) buf[i] = dis[i];
  sort(tmp, tmp + n), count = unique(tmp, tmp + n) - tmp;
  for (int i = 1; i <= n; i++)
    distance[i] = lower_bound(tmp, tmp + count, dis[i]) - buf;
  return;
}
long long getSiz(int lx, int ly, int rx, int ry) {
  return siz[rx][ry] - siz[rx][ly - 1] - siz[lx - 1][ry] + siz[lx - 1][ly - 1];
}
long long getSum(int lx, int ly, int rx, int ry) {
  return sum[rx][ry] - sum[rx][ly - 1] - sum[lx - 1][ry] + sum[lx - 1][ly - 1];
}
int main() {
  cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);
  cin >> n >> m >> pos[Tavas] >> pos[Nafas];
  for (int i = 1; i <= n; i++) cin >> val[i];
  for (int i = 1; i <= m; i++)
    cin >> u >> v >> w, nxt[u].emplace_back(v, w), nxt[v].emplace_back(u, w);
  dijkstra(pos[Tavas], cnt[Tavas], dis[Tavas]),
      dijkstra(pos[Nafas], cnt[Nafas], dis[Nafas]);
  for (int i = 1; i <= n; i++)
    siz[dis[Tavas][i]][dis[Nafas][i]]++,
        sum[dis[Tavas][i]][dis[Nafas][i]] += val[i];
  for (int i = 1; i <= cnt[Tavas]; i++)
    for (int j = 1; j <= cnt[Nafas]; j++)
      siz[i][j] += siz[i - 1][j] + siz[i][j - 1] - siz[i - 1][j - 1],
          sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
  for (int i = cnt[Tavas]; i; i--)
    for (int j = cnt[Nafas]; j; j--)
      dp[Tavas][i][j] = getSiz(i, j, i, cnt[Nafas])
                            ? max(dp[Tavas][i + 1][j], dp[Nafas][i + 1][j]) +
                                  getSum(i, j, i, cnt[Nafas])
                            : dp[Tavas][i + 1][j],
      dp[Nafas][i][j] = getSiz(i, j, cnt[Tavas], j)
                            ? min(dp[Tavas][i][j + 1], dp[Nafas][i][j + 1]) -
                                  getSum(i, j, cnt[Tavas], j)
                            : dp[Nafas][i][j + 1];
  cout << (dp[Tavas][1][1] > 0   ? "Break a heart"
           : dp[Tavas][1][1] < 0 ? "Cry"
                                 : "Flowers")
       << endl;
  return 0;
}
