#include <bits/stdc++.h>
using namespace std;
template <class T>
bool setmax(T &_a, T _b) {
  if (_b > _a) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
bool setmin(T &_a, T _b) {
  if (_b < _a) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
T gcd(T _a, T _b) {
  return _b == 0 ? _a : gcd(_b, _a % _b);
}
const int MAXN = 2020;
const int MAXE = 100010;
int ea[MAXE], eb[MAXE], ec[MAXE];
int start_point[2];
int val[MAXN];
int n, m;
void init() {
  scanf("%d%d", &n, &m);
  for (int i = int(0); i <= int((2) - 1); ++i) scanf("%d", &start_point[i]);
  for (int i = int(1); i <= int(n); ++i) scanf("%d", &val[i]);
  for (int i = int(1); i <= int(m); ++i)
    scanf("%d%d%d", &ea[i], &eb[i], &ec[i]);
}
int ind[2][MAXN], pos[2][MAXN];
long long dis[2][MAXN];
bool v[2][MAXN][MAXN], v2[2][MAXN][MAXN];
long long s[2][MAXN][MAXN];
void preprocess() {
  for (int t = int(0); t <= int((2) - 1); ++t) {
    memset(dis[t], 50, sizeof(dis[t]));
    dis[t][start_point[t]] = 0;
    for (int times = int(0); times <= int((n)-1); ++times) {
      for (int i = int(1); i <= int(m); ++i)
        setmin(dis[t][eb[i]], dis[t][ea[i]] + (long long)ec[i]);
      for (int i = int(1); i <= int(m); ++i)
        setmin(dis[t][ea[i]], dis[t][eb[i]] + (long long)ec[i]);
    }
    vector<pair<long long, int>> tmp;
    for (int i = int(1); i <= int(n); ++i)
      tmp.push_back(make_pair(dis[t][i], i));
    sort(tmp.begin(), tmp.end());
    for (int i = int(1); i <= int(n); ++i)
      ind[t][i] = tmp[i - 1].second, pos[t][ind[t][i]] = i;
  }
  for (int t = int(0); t <= int((2) - 1); ++t) {
    for (int x = int(0); x <= int(n); ++x) {
      static bool ok[MAXN];
      memset(ok, true, sizeof(ok));
      for (int i = int(1); i <= int(x); ++i) ok[ind[t][i]] = false;
      memset(v[t][x], false, sizeof(v[t][x]));
      memset(v2[t][x], false, sizeof(v2[t][x]));
      long long la = 1LL << 60;
      for (int i = int(n); i >= int(1); --i) {
        if (ok[ind[t ^ 1][i]]) {
          long long d = dis[t ^ 1][ind[t ^ 1][i]];
          if (d < la) {
            v[t][x][i] = true;
            la = d;
          }
        }
        v2[t][x][i] = (v[t][x][i] || v2[t][x][i + 1]);
      }
      s[t][x][0] = 0;
      for (int i = int(1); i <= int(n); ++i) {
        long long c = val[ind[t ^ 1][i]];
        if (!ok[ind[t ^ 1][i]]) c = 0;
        s[t][x][i] = s[t][x][i - 1] + c;
      }
    }
  }
}
long long f[2][MAXN][MAXN];
long long g[2][MAXN][MAXN];
bool bf[2][MAXN][MAXN];
bool bg[2][MAXN][MAXN];
long long cal_g(int, int, int);
long long cal_f(int, int, int);
long long cal_g(int t, int x, int y) {
  if (bg[t][x][y]) return g[t][x][y];
  bg[t][x][y] = true;
  long long &ans = g[t][x][y];
  ans = -1LL << 60;
  if (y < n) setmax(ans, cal_g(t, x, y + 1));
  if (v[t][x][y]) setmax(ans, s[t][x][y] - cal_f(t, x, y));
  return ans;
}
long long cal_f(int t, int x, int y) {
  if (bf[t][x][y]) return f[t][x][y];
  bf[t][x][y] = true;
  long long &ans = f[t][x][y];
  if (!v2[t ^ 1][y][x + 1]) return ans = 0;
  ans = cal_g(t ^ 1, y, x + 1) - s[t ^ 1][y][x];
  return ans;
}
void solve() {
  memset(bg, false, sizeof(bg));
  memset(bf, false, sizeof(bf));
  long long ans = cal_f(0, 0, 0);
  if (ans == 0)
    cout << "Flowers" << endl;
  else {
    if (ans < 0)
      cout << "Cry" << endl;
    else
      cout << "Break a heart" << endl;
  }
}
int main() {
  init();
  preprocess();
  solve();
  return 0;
}
