#include <bits/stdc++.h>
const long long inf = 9e18;
inline int read() {
  char c = getchar();
  int x = 0, ft = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') ft = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
  return x * ft;
}
const int N = 2e3 + 5;
const int M = 1e5 + 5;
int n, m, ss, tt, val[N], h[N], edge_cnt, done[N], tc;
long long ds[N], dt[N], tmp[N];
struct Edge {
  int to, nex, w;
} e[M << 1];
inline void add_edge(int u, int v, int w) {
  e[++edge_cnt] = (Edge){v, h[u], w};
  h[u] = edge_cnt;
}
struct Node {
  long long v;
  int id;
  bool operator<(const Node& r) const { return v > r.v; }
};
inline void dijkstra(int s, long long* d) {
  for (int u = 1; u <= n; ++u) {
    done[u] = 0;
    d[u] = inf;
  }
  std::priority_queue<Node> Q;
  d[s] = 0;
  Q.push((Node){d[s], s});
  while (!Q.empty()) {
    int u = Q.top().id;
    Q.pop();
    if (done[u]) continue;
    done[u] = 1;
    for (int i = h[u], v; i; i = e[i].nex) {
      if (d[v = e[i].to] > d[u] + e[i].w) {
        d[v] = d[u] + e[i].w;
        Q.push((Node){d[v], v});
      }
    }
  }
}
int x[N], y[N], tag[N][N], nexX[N][N], nexY[N][N];
long long sum[N][N], fX[N][N], fY[N][N];
inline void solve() {
  for (int i = 1; i <= n; ++i) sum[x[i]][y[i]] += val[i], tag[x[i]][y[i]] = 1;
  for (int i = n; i >= 1; --i)
    for (int j = n; j >= 1; --j) {
      sum[i][j] += sum[i + 1][j] + sum[i][j + 1] - sum[i + 1][j + 1];
      nexX[i][j] =
          std::min(i < n ? nexX[i + 1][j] : n, j < n ? nexX[i][j + 1] : n);
      nexY[i][j] =
          std::min(i < n ? nexY[i + 1][j] : n, j < n ? nexY[i][j + 1] : n);
      if (tag[i][j]) nexX[i][j] = i, nexY[i][j] = j;
    }
  for (int i = n; i >= 1; --i)
    for (int j = n; j >= 1; --j) {
      fX[i][j] = sum[i][j] - fY[nexX[i][j] + 1][j];
      fY[i][j] = sum[i][j] - fX[i][nexY[i][j] + 1];
      if (i == 1 && j == 1) continue;
      fX[i][j] = std::min(fX[i][j], fX[i][j + 1]);
      fY[i][j] = std::min(fY[i][j], fY[i + 1][j]);
    }
  long long ts = fX[1][1], ns = sum[1][1] - ts;
  puts(ts == ns ? "Flowers" : (ts < ns ? "Cry" : "Break a heart"));
}
int main() {
  n = read();
  m = read();
  ss = read();
  tt = read();
  for (int i = 1; i <= n; ++i) val[i] = read();
  for (int i = 1; i <= m; ++i) {
    int u = read(), v = read(), w = read();
    add_edge(u, v, w);
    add_edge(v, u, w);
  }
  dijkstra(ss, ds);
  dijkstra(tt, dt);
  tc = 0;
  for (int i = 1; i <= n; ++i) tmp[++tc] = ds[i];
  std::sort(tmp + 1, tmp + 1 + tc);
  tc = std::unique(tmp + 1, tmp + 1 + tc) - tmp - 1;
  for (int i = 1; i <= n; ++i)
    x[i] = std::lower_bound(tmp + 1, tmp + 1 + tc, ds[i]) - tmp;
  tc = 0;
  for (int i = 1; i <= n; ++i) tmp[++tc] = dt[i];
  std::sort(tmp + 1, tmp + 1 + tc);
  tc = std::unique(tmp + 1, tmp + 1 + tc) - tmp - 1;
  for (int i = 1; i <= n; ++i)
    y[i] = std::lower_bound(tmp + 1, tmp + 1 + tc, dt[i]) - tmp;
  solve();
  return 0;
}
