#include <bits/stdc++.h>
using namespace std;
long long read() {
  long long x = 0, f = 0;
  char ch = getchar();
  while (!isdigit(ch)) f = ch == '-', ch = getchar();
  while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
  return f ? -x : x;
}
const int N = 2005;
const long long INF = 1e18;
int n, m, S, T;
vector<pair<int, int> > e[N];
int a[N];
long long dS[N], dT[N];
vector<int> idS[N], idT[N];
int Sc, Tc;
void Dijkstra(int S, long long *dis, vector<int> *id, int &idc) {
  static int vis[N];
  priority_queue<pair<long long, int>, vector<pair<long long, int> >,
                 greater<pair<long long, int> > >
      Q;
  while (!Q.empty()) Q.pop();
  for (int i = (1); i <= (n); i++) dis[i] = INF;
  memset(vis, 0, sizeof vis);
  dis[S] = 0;
  Q.push(make_pair(dis[S], S));
  idc = 0;
  while (!Q.empty()) {
    pair<long long, int> p = Q.top();
    Q.pop();
    int x = p.second;
    if (vis[x]) continue;
    vis[x] = 1;
    if (!idc || dis[id[idc].back()] != dis[x]) idc++;
    id[idc].push_back(x);
    for (auto E : e[x])
      if (!vis[E.first] && dis[x] + E.second < dis[E.first]) {
        dis[E.first] = dis[x] + E.second;
        Q.push(make_pair(dis[x] + E.second, E.first));
      }
  }
}
long long pre[N][N][2], dp[N][N][2];
int gameover[N][N];
int pS[N], pT[N];
int main() {
  n = read(), m = read();
  S = read(), T = read();
  for (int i = (1); i <= (n); i++) a[i] = read();
  for (int i = (1); i <= (m); i++) {
    int x = read(), y = read(), z = read();
    e[x].push_back(make_pair(y, z));
    e[y].push_back(make_pair(x, z));
  }
  Dijkstra(S, dS, idS, Sc);
  Dijkstra(T, dT, idT, Tc);
  for (int i = (1); i <= (Sc); i++)
    for (auto x : idS[i]) pS[x] = i;
  for (int i = (1); i <= (Tc); i++)
    for (auto x : idT[i]) pT[x] = i;
  for (int i = (0); i <= (Sc); i++) {
    int mi = 0;
    for (int j = (1); j <= (n); j++)
      if (pS[j] > i) mi = max(mi, pT[j]);
    for (int j = (mi); j <= (Tc); j++) gameover[i][j] = 1;
  }
  for (int i = (0); i <= (N - 1); i++)
    for (int j = (0); j <= (N - 1); j++)
      for (int k = (0); k <= (1); k++) pre[i][j][k] = dp[i][j][k] = -INF;
  for (int i = (Sc); i >= (0); i--)
    for (int j = (Tc); j >= (0); j--) {
      if (gameover[i][j]) {
        dp[i][j][0] = 0;
        dp[i][j][1] = 0;
        pre[i][j][0] = 0;
        pre[i][j][1] = 0;
      } else {
        int flag = 0;
        long long s = 0;
        for (auto t : idS[i + 1])
          if (pT[t] > j) s += a[t], flag = 1;
        pre[i][j][0] = max(pre[i + 1][j][0], dp[i + 1][j][1]) + s;
        dp[i][j][0] = dp[i + 1][j][0] + s;
        if (flag) dp[i][j][0] = max(dp[i][j][0], pre[i][j][0]);
        flag = 0;
        s = 0;
        for (auto t : idT[j + 1])
          if (pS[t] > i) s += a[t], flag = 1;
        pre[i][j][1] = min(pre[i][j + 1][1], dp[i][j + 1][0]) - s;
        dp[i][j][1] = dp[i][j + 1][1] - s;
        if (flag) dp[i][j][1] = min(dp[i][j][1], pre[i][j][1]);
      }
    }
  long long v = dp[0][0][0];
  if (v < 0)
    puts("Cry");
  else if (v == 0)
    puts("Flowers");
  else
    puts("Break a heart");
  return 0;
}
