#include <bits/stdc++.h>
using namespace std;
struct edge {
  int to, next, w;
} ed[300010];
int sz, head[100010], vis[5010], ss, tt, p[5010], cnt[2010][2010],
    chang[2010][2020], clie[2020][2020];
long long d[5010][2], f[2010][2010][2], hang[2010][2010], lie[2010][2010],
    x[2010], y[2010], a[2010][2010];
inline void add_edge(int from, int to, int w) {
  ed[++sz].to = to;
  ed[sz].next = head[from];
  ed[sz].w = w;
  head[from] = sz;
}
inline int read() {
  char c = getchar();
  int x = 0, flag = 1;
  while (!isdigit(c)) {
    if (c == '-') flag = -1;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
  return x * flag;
}
void spfa(int s, int t) {
  priority_queue<pair<long long, int>, vector<pair<long long, int> >,
                 greater<pair<long long, int> > >
      q;
  memset(vis, 0, sizeof(vis));
  d[s][t] = 0;
  q.push(pair<long long, int>(0, s));
  while (!q.empty()) {
    int u = q.top().second;
    q.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (int i = head[u]; i; i = ed[i].next) {
      int v = ed[i].to;
      if (d[u][t] + ed[i].w < d[v][t]) {
        d[v][t] = d[u][t] + ed[i].w;
        q.push(pair<long long, int>(d[v][t], v));
      }
    }
  }
}
int main() {
  int 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();
    add_edge(u, v, w);
    add_edge(v, u, w);
  }
  memset(d, 0x3f, sizeof(d));
  spfa(s, 0);
  spfa(t, 1);
  for (int i = 1; i <= n; i++) x[i] = d[i][0], y[i] = d[i][1];
  sort(x + 1, x + n + 1);
  sort(y + 1, y + n + 1);
  int ss = unique(x + 1, x + n + 1) - x - 1;
  int tt = unique(y + 1, y + n + 1) - y - 1;
  for (int i = 1; i <= n; i++)
    d[i][0] = lower_bound(x + 1, x + ss + 1, d[i][0]) - x;
  for (int i = 1; i <= n; i++)
    d[i][1] = lower_bound(y + 1, y + tt + 1, d[i][1]) - y;
  for (int i = 1; i <= n; i++)
    x[i] = d[i][0], y[i] = d[i][1], a[x[i]][y[i]] += p[i], cnt[x[i]][y[i]]++;
  for (int i = n; i >= 1; i--)
    for (int j = n; j >= 1; j--) {
      hang[i][j] = hang[i][j + 1] + a[i][j],
      lie[i][j] = lie[i + 1][j] + a[i][j];
      chang[i][j] = chang[i][j + 1] + cnt[i][j],
      clie[i][j] = clie[i + 1][j] + cnt[i][j];
    }
  for (int i = ss; i >= 1; i--) {
    for (int j = tt; j >= 1; j--) {
      if (chang[i][j])
        f[i][j][0] = max(f[i + 1][j][0], f[i + 1][j][1]) + hang[i][j];
      else
        f[i][j][0] = f[i + 1][j][0];
      if (clie[i][j])
        f[i][j][1] = min(f[i][j + 1][0], f[i][j + 1][1]) - lie[i][j];
      else
        f[i][j][1] = f[i][j + 1][1];
    }
  }
  if (f[1][1][0] > 0)
    puts("Break a heart");
  else if (f[1][1][0] < 0)
    puts("Cry");
  else
    puts("Flowers");
  return 0;
}
