#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
const long long INF = 1E18;
int n, m, s, t;
struct Edge {
  int to, val;
  Edge(int v, int w) : to(v), val(w) {}
};
struct Node {
  long long dis;
  int pos;
  Node(long long d, int p) : dis(d), pos(p) {}
  bool operator<(const Node& rhs) const { return dis > rhs.dis; }
};
vector<Edge> G[MAXN];
void Dijkstra(int s, long long* dis) {
  static bool vis[MAXN];
  priority_queue<Node> pq;
  for (int i = 1; i <= n; i++) dis[i] = INF, vis[i] = 0;
  dis[s] = 0, pq.push(Node(0, s));
  while (!pq.empty()) {
    int u = pq.top().pos;
    pq.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (Edge e : G[u])
      if (dis[u] + e.val < dis[e.to]) {
        dis[e.to] = dis[u] + e.val;
        pq.push(Node(dis[e.to], e.to));
      }
  }
}
int p[MAXN];
long long d1[MAXN], d2[MAXN];
long long v1[MAXN], v2[MAXN];
int c1, c2;
int cnt[MAXN][MAXN];
long long sum[MAXN][MAXN];
long long f[MAXN][MAXN][2];
long long g[2][MAXN];
int main() {
  scanf("%d%d%d%d", &n, &m, &s, &t);
  for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
  for (int i = 1, u, v, w; i <= m; i++) {
    scanf("%d%d%d", &u, &v, &w);
    G[u].push_back(Edge(v, w));
    G[v].push_back(Edge(u, w));
  }
  Dijkstra(s, d1);
  Dijkstra(t, d2);
  for (int i = 1; i <= n; i++) v1[c1++] = d1[i], v2[c2++] = d2[i];
  sort(v1, v1 + c1);
  c1 = unique(v1, v1 + c1) - v1;
  sort(v2, v2 + c2);
  c2 = unique(v2, v2 + c2) - v2;
  for (int i = 1; i <= n; i++) {
    d1[i] = lower_bound(v1, v1 + c1, d1[i]) - v1;
    d2[i] = lower_bound(v2, v2 + c2, d2[i]) - v2;
  }
  for (int i = 1; i <= n; i++) {
    cnt[d1[i]][d2[i]]++;
    sum[d1[i]][d2[i]] += p[i];
  }
  for (int i = 0; i < c1; i++) g[0][i] = INF;
  for (int i = 0; i < c2; i++) g[1][i] = INF;
  for (int i = c1 - 1; i >= 0; i--)
    for (int j = c2 - 1; j >= 0; j--) {
      cnt[i][j] += cnt[i + 1][j] + cnt[i][j + 1] - cnt[i + 1][j + 1];
      sum[i][j] += sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1];
      if (cnt[i][j] == 0) {
        f[i][j][0] = f[i][j][1] = 0;
        continue;
      }
      if (cnt[i][j] > cnt[i][j + 1])
        for (int k = j + 1; k <= c2 && cnt[i][k] == cnt[i][j + 1]; k++)
          g[0][i] = min(g[0][i], f[i][k][0]);
      if (cnt[i][j] > cnt[i + 1][j])
        for (int k = i + 1; k <= c1 && cnt[k][j] == cnt[i + 1][j]; k++)
          g[1][j] = min(g[1][j], f[k][j][1]);
      f[i][j][0] = sum[i][j] - g[1][j];
      f[i][j][1] = sum[i][j] - g[0][i];
    }
  long long x = f[0][0][0], y = sum[0][0] - x;
  if (x < y)
    puts("Cry");
  else if (x > y)
    puts("Break a heart");
  else
    puts("Flowers");
  return 0;
}
