#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
const long long maxn = 2010;
const long long maxm = 1e6 + 1e2;
long long point[maxn], nxt[maxm], to[maxm];
long long cnt, n, m;
long long dis[maxn], vis[maxn];
long long sumx[maxn][maxn], sumy[maxn][maxn];
long long numx[maxn][maxn], numy[maxn][maxn];
long long val[maxm];
long long disn[maxn];
long long cost[maxn];
long long hang, line;
long long s, t;
long long sum[maxn][maxn];
long long num[maxn][maxn];
long long dp[maxn][maxn][2];
priority_queue<pair<long long, long long>, vector<pair<long long, long long> >,
               greater<pair<long long, long long> > >
    q;
struct Node {
  long long x, y;
};
Node a[maxn];
vector<long long> vx, vy;
void addedge(long long x, long long y, long long w) {
  nxt[++cnt] = point[x];
  to[cnt] = y;
  val[cnt] = w;
  point[x] = cnt;
}
void dijkstra(long long s) {
  memset(vis, 0, sizeof(vis));
  memset(dis, 127 / 3, sizeof(dis));
  dis[s] = 0;
  q.push(make_pair(0, s));
  while (!q.empty()) {
    long long x = q.top().second;
    q.pop();
    if (vis[x]) continue;
    vis[x] = 1;
    for (long long i = point[x]; i; i = nxt[i]) {
      long long p = to[i];
      if (dis[p] > dis[x] + val[i]) {
        dis[p] = dis[x] + val[i];
        q.push(make_pair(dis[p], p));
      }
    }
  }
}
void dijkstran(long long s) {
  memset(vis, 0, sizeof(vis));
  memset(disn, 127 / 3, sizeof(disn));
  disn[s] = 0;
  q.push(make_pair(0, s));
  while (!q.empty()) {
    long long x = q.top().second;
    q.pop();
    if (vis[x]) continue;
    vis[x] = 1;
    for (long long i = point[x]; i; i = nxt[i]) {
      long long p = to[i];
      if (disn[p] > disn[x] + val[i]) {
        disn[p] = disn[x] + val[i];
        q.push(make_pair(disn[p], p));
      }
    }
  }
}
long long getnumx(long long x, long long l, long long r) {
  return numx[x][r] - numx[x][l - 1];
}
long long getnumy(long long y, long long l, long long r) {
  return numy[r][y] - numy[l - 1][y];
}
long long getsumx(long long x, long long l, long long r) {
  return sumx[x][r] - sumx[x][l - 1];
}
long long getsumy(long long y, long long l, long long r) {
  return sumy[r][y] - sumy[l - 1][y];
}
signed main() {
  n = read(), m = read();
  s = read(), t = read();
  long long flag = 0;
  for (long long i = 1; i <= n; i++) cost[i] = read();
  for (long long i = 1; i <= m; i++) {
    long long x = read(), y = read(), w = read();
    addedge(x, y, w);
    addedge(y, x, w);
  }
  dijkstra(s);
  dijkstran(t);
  for (long long i = 1; i <= n; i++)
    vx.push_back(dis[i]), vy.push_back(disn[i]);
  sort(vx.begin(), vx.end());
  sort(vy.begin(), vy.end());
  long long hang = unique(vx.begin(), vx.end()) - vx.begin();
  long long line = unique(vy.begin(), vy.end()) - vy.begin();
  vx.resize(hang);
  vy.resize(line);
  for (long long i = 1; i <= n; i++) {
    long long x = lower_bound(vx.begin(), vx.end(), dis[i]) - vx.begin() + 1;
    long long y = lower_bound(vy.begin(), vy.end(), disn[i]) - vy.begin() + 1;
    num[x][y]++;
    sum[x][y] += cost[i];
  }
  for (long long i = 1; i <= hang + 1; i++)
    for (long long j = 1; j <= line + 1; j++)
      sumx[i][j] = sumx[i][j - 1] + sum[i][j],
      numx[i][j] = numx[i][j - 1] + num[i][j];
  for (long long j = 1; j <= line + 1; j++)
    for (long long i = 1; i <= hang + 1; i++)
      sumy[i][j] = sumy[i - 1][j] + sum[i][j],
      numy[i][j] = numy[i - 1][j] + num[i][j];
  for (long long i = hang; i >= 0; i--)
    for (long long j = line; j >= 0; j--) {
      if (i != hang) {
        long long now = getnumx(i + 1, j + 1, line);
        long long ss = getsumx(i + 1, j + 1, line);
        if (!now)
          dp[i][j][0] = dp[i + 1][j][0];
        else
          dp[i][j][0] = max(dp[i + 1][j][0], dp[i + 1][j][1]) + ss;
      }
      if (j != line) {
        long long now = getnumy(j + 1, i + 1, hang);
        long long ss = getsumy(j + 1, i + 1, hang);
        if (!now)
          dp[i][j][1] = dp[i][j + 1][1];
        else
          dp[i][j][1] = min(dp[i][j + 1][0], dp[i][j + 1][1]) - ss;
      }
    }
  if (dp[0][0][0] > 0)
    cout << "Break a heart"
         << "\n";
  if (dp[0][0][0] < 0)
    cout << "Cry"
         << "\n";
  if (dp[0][0][0] == 0)
    cout << "Flowers"
         << "\n";
  return 0;
}
