#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
struct edge {
  int to, next, w;
} e[200010];
int head[N], ecnt, n, vis[N], val[N], mark[N][N];
long long dp[2][N][N], cover[N][N], sum;
inline void adde(int from, int to, int w) {
  e[++ecnt] = (edge){to, head[from], w}, head[from] = ecnt;
  e[++ecnt] = (edge){from, head[to], w}, head[to] = ecnt;
}
inline void Dijkstra(long long d[], int s) {
  for (int i = 1; i <= n; i++) d[i] = 1e18;
  memset(vis, 0, sizeof(vis));
  priority_queue<pair<long long, int> > q;
  q.push(pair<long long, int>(0, s)), d[s] = 0;
  while (!q.empty()) {
    int u = q.top().second;
    q.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (int i = head[u]; i; i = e[i].next)
      if (!vis[e[i].to] && d[u] + e[i].w < d[e[i].to])
        d[e[i].to] = d[u] + e[i].w,
        q.push(pair<long long, int>(-d[e[i].to], e[i].to));
  }
}
inline void work(int s, int t) {
  static long long S[N], T[N], tmp[N];
  Dijkstra(S, s), Dijkstra(T, t);
  int top = 0;
  for (int i = 1; i <= n; i++) tmp[++top] = S[i];
  sort(tmp + 1, tmp + top + 1), top = unique(tmp + 1, tmp + top + 1) - tmp - 1;
  for (int i = 1; i <= n; i++)
    S[i] = lower_bound(tmp + 1, tmp + top + 1, S[i]) - tmp;
  top = sum = 0;
  for (int i = 1; i <= n; i++) tmp[++top] = T[i];
  sort(tmp + 1, tmp + top + 1), top = unique(tmp + 1, tmp + top + 1) - tmp - 1;
  for (int i = 1; i <= n; i++) sum += val[i];
  for (int i = 1; i <= n; i++)
    T[i] = lower_bound(tmp + 1, tmp + top + 1, T[i]) - tmp;
  for (int i = 1; i <= n; i++)
    cover[S[i] - 1][T[i] - 1] -= val[i], mark[S[i] - 1][T[i] - 1] = -1;
  for (int i = n; i >= 0; i--)
    for (int j = n; j >= 0; j--) {
      cover[i][j] += cover[i + 1][j] + cover[i][j + 1] - cover[i + 1][j + 1];
      mark[i][j] += mark[i + 1][j] + mark[i][j + 1] - mark[i + 1][j + 1];
    }
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= n; j++) cover[i][j] += sum, mark[i][j] += n;
}
int nxt[2][N][N];
long long f[N][N], g[N][N];
int main() {
  int m, s, t;
  scanf("%d%d%d%d", &n, &m, &s, &t);
  for (int i = 1; i <= n; i++) scanf("%d", &val[i]);
  for (int i = 1, a, b, c; i <= m; i++)
    scanf("%d%d%d", &a, &b, &c), adde(a, b, c);
  work(s, t);
  for (int i = 0; i <= n + 1; i++)
    for (int j = 0; j <= n + 1; j++) f[i][j] = g[i][j] = -1e18;
  for (int i = n; i >= 0; i--)
    for (int j = n; j >= 0; j--) {
      if (mark[i][j] != mark[i + 1][j])
        nxt[1][i][j] = i + 1;
      else
        nxt[1][i][j] = nxt[1][i + 1][j];
      if (mark[i][j] != mark[i][j + 1])
        nxt[0][i][j] = j + 1;
      else
        nxt[0][i][j] = nxt[0][i][j + 1];
    }
  for (int i = n; i >= 0; i--)
    for (int j = n; j >= 0; j--) {
      f[i][j] = f[i + 1][j], g[i][j] = g[i][j + 1];
      if (cover[i][j] == sum)
        dp[0][i][j] = dp[1][i][j] = 0;
      else
        dp[1][i][j] = f[nxt[1][i][j]][j] - cover[i][j],
        dp[0][i][j] = g[i][nxt[0][i][j]] - cover[i][j];
      f[i][j] = max(f[i][j], cover[i][j] - dp[0][i][j]),
      g[i][j] = max(g[i][j], cover[i][j] - dp[1][i][j]);
    }
  long long w = dp[1][0][0];
  if (w == 0)
    puts("Flowers");
  else
    puts(w > 0 ? "Break a heart" : "Cry");
  return 0;
}
