#include <bits/stdc++.h>
using namespace std;
int N, S, T;
long long graph[2010][2010];
long long p[2010];
long long dist[2010];
bool used[2010];
long long dists[2010], distt[2010];
vector<pair<long long, int> > vs, vt;
int ranks[2010], rankt[2010];
long long dps[2010][2010], dpt[2010][2010];
bool new_s[2010][2010], new_t[2010][2010];
long long calc_s(int x, int y) {
  if (x == N) return 0;
  if (!new_s[x][y]) return dps[x + 1][y];
  long long next_cost = p[vs[x].second];
  long long ans = next_cost + dps[x + 1][y];
  for (int i = x + 1; i <= N; i++) {
    ans = max(ans, next_cost - dpt[i][y]);
    if (new_s[i][y]) break;
  }
  return ans;
}
long long calc_t(int x, int y) {
  if (y == N) return 0;
  if (!new_t[x][y]) return dpt[x][y + 1];
  long long next_cost = p[vt[y].second];
  long long ans = next_cost + dpt[x][y + 1];
  for (int i = y + 1; i <= N; i++) {
    ans = max(ans, next_cost - dps[x][i]);
    if (new_t[x][i]) break;
  }
  return ans;
}
void main2(void) {
  int i, j;
  for ((i) = 0; (i) < (int)(N); (i)++)
    for ((j) = 0; (j) < (int)(N + 1); (j)++)
      new_s[i][j] = (rankt[vs[i].second] >= j);
  for ((i) = 0; (i) < (int)(N + 1); (i)++)
    for ((j) = 0; (j) < (int)(N); (j)++)
      new_t[i][j] = (ranks[vt[j].second] >= i);
  for (i = N; i >= 0; i--)
    for (j = N; j >= 0; j--) {
      dps[i][j] = calc_s(i, j);
      dpt[i][j] = calc_t(i, j);
    }
  long long ans = dps[0][0];
  if (ans > 0) cout << "Break a heart" << endl;
  if (ans < 0) cout << "Cry" << endl;
  if (ans == 0) cout << "Flowers" << endl;
}
void get_dist(int s) {
  int i, j;
  for ((i) = 0; (i) < (int)(N); (i)++) dist[i] = (1ll << 60);
  for ((i) = 0; (i) < (int)(N); (i)++) used[i] = false;
  dist[s] = 0;
  for ((i) = 0; (i) < (int)(N); (i)++) {
    int x = -1;
    for ((j) = 0; (j) < (int)(N); (j)++)
      if (!used[j] && (x == -1 || dist[j] < dist[x])) x = j;
    used[x] = true;
    for ((j) = 0; (j) < (int)(N); (j)++)
      dist[j] = min(dist[j], dist[x] + graph[x][j]);
  }
}
int main(void) {
  int M, i, j;
  cin >> N >> M >> S >> T;
  S--;
  T--;
  for ((i) = 0; (i) < (int)(N); (i)++) {
    int tmp;
    scanf("%d", &tmp);
    p[i] = tmp;
  }
  for ((i) = 0; (i) < (int)(N); (i)++)
    for ((j) = 0; (j) < (int)(N); (j)++)
      if (i != j) graph[i][j] = (1ll << 60);
  for ((i) = 0; (i) < (int)(M); (i)++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    u--;
    v--;
    graph[u][v] = min(graph[u][v], (long long)w);
    graph[v][u] = min(graph[v][u], (long long)w);
  }
  get_dist(S);
  for ((i) = 0; (i) < (int)(N); (i)++) dists[i] = dist[i];
  get_dist(T);
  for ((i) = 0; (i) < (int)(N); (i)++) distt[i] = dist[i];
  for ((i) = 0; (i) < (int)(N); (i)++) vs.push_back(make_pair(dists[i], i));
  sort(vs.begin(), vs.end());
  for ((i) = 0; (i) < (int)(N); (i)++) vt.push_back(make_pair(distt[i], i));
  sort(vt.begin(), vt.end());
  for ((i) = 0; (i) < (int)(N); (i)++) ranks[vs[i].second] = i;
  for ((i) = 0; (i) < (int)(N); (i)++) rankt[vt[i].second] = i;
  main2();
  return 0;
}
