#include <bits/stdc++.h>
using namespace std;
int n, m, s, t, tot, X, Y;
const long long N = 2010, M = 100010, inf = 1e18;
int head[N], to[M << 1], nt[M << 1], len[M << 1], siz[N][N], vis[N], pos[2][N];
long long dis[2][N], val[N], sum[N][N], tmp[N], f[2][N][N], g[2][N][N];
void add(int f, int t, int d) {
  to[++tot] = t;
  len[tot] = d;
  nt[tot] = head[f];
  head[f] = tot;
}
void DIJ(int s, long long *dis) {
  int x;
  priority_queue<pair<long long, int> > q;
  for (int i = 1; i <= n; ++i) dis[i] = inf, vis[i] = 0;
  dis[s] = 0;
  q.push(pair<long long, int>(0, s));
  while (!q.empty()) {
    x = q.top().second;
    q.pop();
    if (vis[x]) continue;
    vis[x] = 1;
    for (int i = head[x]; i; i = nt[i])
      if (dis[to[i]] > dis[x] + len[i]) {
        dis[to[i]] = dis[x] + len[i];
        q.push(pair<long long, int>(-dis[to[i]], to[i]));
      }
  }
}
void UNI(long long *a, int &m) {
  int cnt = 0;
  for (int i = 1; i <= n; ++i) tmp[++cnt] = a[i];
  sort(tmp + 1, tmp + 1 + cnt);
  m = unique(tmp + 1, tmp + 1 + cnt) - tmp - 1;
  for (int i = 1; i <= n; ++i)
    a[i] = lower_bound(tmp + 1, tmp + 1 + m, a[i]) - tmp;
}
int query(int X1, int Y1, int X2, int Y2) { return siz[X1][Y1] - siz[X2][Y2]; }
signed main() {
  cin >> n >> m >> s >> t;
  for (int i = 1; i <= n; ++i) scanf("%lld", &val[i]);
  for (int i = 1, x, y, z; i <= m; ++i)
    scanf("%d%d%d", &x, &y, &z), add(x, y, z), add(y, x, z);
  DIJ(s, dis[0]);
  DIJ(t, dis[1]);
  UNI(dis[0], X);
  UNI(dis[1], Y);
  for (int i = 1; i <= n; ++i) {
    sum[dis[0][i]][dis[1][i]] += val[i];
    ++siz[dis[0][i]][dis[1][i]];
  }
  for (int i = X; i >= 1; --i)
    for (int j = Y; j >= 1; --j) {
      sum[i][j] += sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1];
      siz[i][j] += siz[i + 1][j] + siz[i][j + 1] - siz[i + 1][j + 1];
    }
  memset(f, -0x3f, sizeof(f));
  for (int i = 1; i <= X; ++i) pos[1][i] = Y + 1;
  for (int j = 1; j <= Y; ++j) pos[0][j] = X + 1;
  for (int i = 1; i <= Y; ++i) pos[0][i] = X + 1;
  for (int i = 1; i <= X; ++i) pos[1][i] = Y + 1;
  for (int i = X + 1; i >= 1; --i)
    for (int j = Y + 1; j >= 1; --j)
      for (int now = 0; now <= 1; ++now) {
        if (!siz[i][j]) {
          f[now][i][j] = 0;
          continue;
        }
        if (now == 0) {
          while (query(i, j, pos[0][j] - 1, j)) --pos[0][j];
          f[0][i][j] = sum[i][j] - g[1][pos[0][j]][j];
          g[0][i][j] = min(g[0][i][j + 1], f[0][i][j] + sum[i][j]);
        } else {
          while (query(i, j, i, pos[1][i] - 1)) --pos[1][i];
          f[1][i][j] = sum[i][j] - g[0][i][pos[1][i]];
          g[1][i][j] = min(g[1][i + 1][j], f[1][i][j] + sum[i][j]);
        }
      }
  if (f[0][1][1] > 0)
    puts("Break a heart");
  else if (f[0][1][1] == 0)
    puts("Flowers");
  else
    puts("Cry");
  return 0;
}
