#include <bits/stdc++.h>
using namespace std;
long long f[2010][2010][2], g[2010][2010][2];
int n, m;
struct Edge {
  int v, c, nxt;
} e[200010];
int tot;
int first[2010];
void build(int u, int v, int c) {
  e[++tot] = (Edge){v, c, first[u]};
  first[u] = tot;
  return;
}
long long tmp[2010];
int p[2010];
long long sum1[2010][2010], sum2[2010][2010];
int num1[2010][2010], num2[2010][2010];
struct Val {
  long long val;
  int pos;
  Val(long long a = 0, int b = 0) {
    val = a;
    pos = b;
  }
};
bool operator<(const Val& a, const Val& b) { return a.val > b.val; }
priority_queue<Val> q;
bool book[2010];
long long dis[2010];
void dij(int s) {
  memset(dis, 0x3f, sizeof(dis));
  memset(book, 0, sizeof(book));
  dis[s] = 0;
  q.push(Val(0, s));
  while (!q.empty()) {
    int u = q.top().pos;
    q.pop();
    if (book[u]) continue;
    book[u] = true;
    for (int i = first[u]; i; i = e[i].nxt)
      if (!book[e[i].v] && dis[u] + e[i].c < dis[e[i].v]) {
        dis[e[i].v] = dis[u] + e[i].c;
        q.push(Val(dis[e[i].v], e[i].v));
      }
  }
  return;
}
vector<int> vec[2][2010];
void work(int s, int id, int& cnt) {
  dij(s);
  for (int i = 1; i <= n; i++) tmp[i] = dis[i];
  sort(tmp + 1, tmp + n + 1);
  cnt = unique(tmp + 1, tmp + n + 1) - tmp - 1;
  for (int i = 1; i <= n; i++)
    vec[id][lower_bound(tmp + 1, tmp + cnt + 1, dis[i]) - tmp].push_back(i);
  return;
}
int main() {
  scanf("%d %d", &n, &m);
  int s, t;
  scanf("%d %d", &s, &t);
  for (int i = 1; i <= n; i++) scanf("%d", &p[i]);
  for (int i = 1; i <= m; i++) {
    int u, v, c;
    scanf("%d %d %d", &u, &v, &c);
    build(u, v, c);
    build(v, u, c);
  }
  int cnt1, cnt2;
  work(s, 0, cnt1);
  work(t, 1, cnt2);
  memset(book, 0, sizeof(book));
  for (int i = 0; i <= cnt2; i++) {
    for (int j = 0; j < vec[1][i].size(); j++) book[vec[1][i][j]] = true;
    for (int j = 1; j <= cnt1; j++)
      for (int k = 0; k < vec[0][j].size(); k++)
        if (!book[vec[0][j][k]]) sum1[i][j] += p[vec[0][j][k]], num1[i][j]++;
  }
  memset(book, 0, sizeof(book));
  for (int i = 0; i <= cnt1; i++) {
    for (int j = 0; j < vec[0][i].size(); j++) book[vec[0][i][j]] = true;
    for (int j = 1; j <= cnt2; j++)
      for (int k = 0; k < vec[1][j].size(); k++)
        if (!book[vec[1][j][k]]) sum2[i][j] += p[vec[1][j][k]], num2[i][j]++;
  }
  for (int i = cnt1; i >= 1; i--)
    for (int j = cnt2; j >= 1; j--) {
      if (num1[j - 1][i])
        f[i][j][0] = f[i + 1][j][1] + sum1[j - 1][i];
      else
        f[i][j][0] = f[i + 1][j][0];
      if (num2[i - 1][j])
        g[i][j][0] = g[i][j + 1][1] + sum2[i - 1][j];
      else
        g[i][j][0] = g[i][j + 1][0];
      f[i][j][1] = max(f[i][j][0], -g[i][j][0]);
      g[i][j][1] = max(g[i][j][0], -f[i][j][0]);
    }
  if (f[1][1][0] < 0)
    printf("Cry\n");
  else if (f[1][1][0] > 0)
    printf("Break a heart\n");
  else
    printf("Flowers\n");
  return 0;
}
