#include <bits/stdc++.h>
using namespace std;
long long n, m, S, T, dis[2010], head[2010], cnt, x, y, z;
long long cnt1, cnt2, a[2010][2010], b[2010][2010], f[2][2010][2010];
bool vis[2010];
struct Edge {
  long long nxt, weight, to;
} edge[200100];
struct Point {
  long long val, disx, disy, x, y;
} point[2010];
struct qnode {
  long long dis, id;
  bool operator<(qnode x) const { return dis > x.dis; }
};
priority_queue<qnode> q;
map<long long, long long> mpx, mpy;
void addedge(long long x, long long y, long long z) {
  edge[++cnt].to = y;
  edge[cnt].weight = z;
  edge[cnt].nxt = head[x];
  head[x] = cnt;
}
void Dijkstra(long long start) {
  memset(dis, 0x3f, sizeof(dis));
  dis[start] = 0;
  memset(vis, false, sizeof(vis));
  while (!q.empty()) q.pop();
  q.push((qnode){0, start});
  while (!q.empty()) {
    start = q.top().id;
    q.pop();
    if (vis[start]) continue;
    vis[start] = true;
    for (long long i = head[start]; i; i = edge[i].nxt) {
      long long upup = edge[i].to;
      if (dis[upup] > dis[start] + edge[i].weight) {
        dis[upup] = min(dis[upup], edge[i].weight + dis[start]);
        if (!vis[upup]) q.push((qnode){dis[upup], upup});
      }
    }
  }
}
void Init() {
  for (long long i = 1; i <= cnt1 + 1; i++)
    for (long long j = 1; j <= cnt2 + 1; j++) {
      a[i][j] = a[i][j] + a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
      b[i][j] = b[i][j] + b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
    }
}
long long calc(long long x1, long long y1, long long x2, long long y2) {
  return a[x2][y2] - a[x2][y1 - 1] - a[x1 - 1][y2] + a[x1 - 1][y1 - 1];
}
long long size(long long x1, long long y1, long long x2, long long y2) {
  return b[x2][y2] - b[x2][y1 - 1] - b[x1 - 1][y2] + b[x1 - 1][y1 - 1];
}
signed main() {
  scanf("%lld%lld%lld%lld", &n, &m, &S, &T);
  for (long long i = 1; i <= n; i++) scanf("%lld", &point[i].val);
  for (long long i = 1; i <= m; i++) {
    scanf("%lld%lld%lld", &x, &y, &z);
    addedge(x, y, z);
    addedge(y, x, z);
  }
  Dijkstra(S);
  for (long long i = 1; i <= n; i++) point[i].disx = dis[i];
  sort(dis + 1, dis + n + 1);
  for (long long i = 1; i <= n; i++)
    if (!mpx[dis[i]]) mpx[dis[i]] = ++cnt1;
  for (long long i = 1; i <= n; i++) point[i].x = mpx[point[i].disx];
  Dijkstra(T);
  for (long long i = 1; i <= n; i++) point[i].disy = dis[i];
  sort(dis + 1, dis + n + 1);
  for (long long i = 1; i <= n; i++)
    if (!mpy[dis[i]]) mpy[dis[i]] = ++cnt2;
  for (long long i = 1; i <= n; i++) point[i].y = mpy[point[i].disy];
  for (long long i = 1; i <= n; i++)
    a[point[i].x][point[i].y] += point[i].val, b[point[i].x][point[i].y]++;
  Init();
  for (long long i = cnt1 + 1; i >= 1; i--)
    for (long long j = cnt2 + 1; j >= 1; j--) {
      if (size(i, j, i, cnt2))
        f[0][i][j] = max(f[0][i + 1][j], f[1][i + 1][j]) + calc(i, j, i, cnt2);
      else
        f[0][i][j] = f[0][i + 1][j];
      if (size(i, j, cnt1, j))
        f[1][i][j] = min(f[0][i][j + 1], f[1][i][j + 1]) - calc(i, j, cnt1, j);
      else
        f[1][i][j] = f[1][i][j + 1];
    }
  if (f[0][1][1] > 0) puts("Break a heart");
  if (f[0][1][1] == 0) puts("Flowers");
  if (f[0][1][1] < 0) puts("Cry");
}
