#include <bits/stdc++.h>
using namespace std;
long long int powm(long long int a, int b, int n) {
  long long int rm = 1;
  while (b) {
    if (b % 2) {
      rm = (rm * a) % n;
    }
    a = (a * a) % n;
    b /= 2;
  }
  return rm;
}
long long int inf;
long long int dps[2010], dpt[2010], dp[2010], dis[2010][2010],
    fa[2010][2010] = {0}, fb[2010][2010] = {0};
int n, m, close[2010], p[2010];
bool V[2010];
void dajik(int vertex) {
  memset(V, false, sizeof(V));
  long long int mn;
  int id;
  dp[vertex] = 0;
  for (int it = int(1); it <= (int)n; it++) {
    mn = inf;
    for (int i = int(1); i <= (int)n; i++)
      if (!V[i] && mn > dp[i]) {
        mn = dp[i];
        id = i;
      }
    if (mn == inf) break;
    V[id] = true;
    for (int i = int(1); i <= (int)n; i++) dp[i] = min(dp[i], mn + dis[id][i]);
  }
}
long long int game[2010][2010][2] = {0}, dp2[2010][2010][2] = {0},
              bsum[2010][2010] = {0};
map<long long int, int> hashing;
vector<int> avec[2010], bvec[2010];
int main() {
  int s, t, u, v, w, t1 = 0, t2 = 0;
  inf = 1000000000000000ll;
  scanf("%d", &n);
  ;
  scanf("%d", &m);
  ;
  scanf("%d", &s);
  ;
  scanf("%d", &t);
  ;
  for (int i = int(1); i <= (int)n; i++) scanf("%d", &p[i]);
  ;
  for (int i = int(1); i <= (int)n; i++)
    for (int j = int(1); j <= (int)n; j++) dis[i][j] = inf;
  for (int i = int(1); i <= (int)n; i++) dis[i][i] = 0;
  for (int i = int(1); i <= (int)m; i++) {
    scanf("%d", &u);
    ;
    scanf("%d", &v);
    ;
    scanf("%d", &w);
    ;
    dis[u][v] = dis[v][u] = min(dis[u][v], 1ll * w);
  }
  for (int i = int(1); i <= (int)n; i++) dp[i] = inf;
  dajik(s);
  for (int i = int(1); i <= (int)n; i++) dps[i] = dp[i];
  sort(dps + 1, dps + n + 1);
  t1 = 1;
  for (int i = 2; i <= n; ++i) {
    if (dps[i] != dps[i - 1]) {
      dps[++t1] = dps[i];
    }
  }
  for (int i = int(1); i <= (int)t1; i++) hashing[dps[i]] = i;
  for (int i = int(1); i <= (int)n; i++) dps[i] = hashing[dp[i]];
  for (int i = int(1); i <= (int)n; i++) dp[i] = inf;
  dajik(t);
  for (int i = int(1); i <= (int)n; i++) dpt[i] = dp[i];
  sort(dpt + 1, dpt + n + 1);
  t2 = 1;
  for (int i = 2; i <= n; ++i)
    if (dpt[i] != dpt[i - 1]) dpt[++t2] = dpt[i];
  hashing.clear();
  for (int i = int(1); i <= (int)t2; i++) hashing[dpt[i]] = i;
  for (int i = int(1); i <= (int)n; i++) dpt[i] = hashing[dp[i]];
  for (int i = 1; i <= n; ++i) {
    avec[dps[i]].push_back(i);
    bvec[dpt[i]].push_back(i);
  }
  memset(close, 0, sizeof(close));
  ;
  long long int cost;
  for (int j = 0; j <= t2; ++j) {
    cost = 0;
    for (int k = 0; k < bvec[j].size(); ++k) close[bvec[j][k]] = 1;
    for (int i = 0; i <= t1; ++i) {
      for (int k = 0; k < avec[i].size(); ++k) {
        if (close[avec[i][k]] == 0) cost += p[avec[i][k]];
      }
      fa[i][j] = cost;
    }
  }
  memset(close, 0, sizeof(close));
  ;
  for (int i = 0; i <= t1; ++i) {
    cost = 0;
    for (int k = 0; k < avec[i].size(); ++k) close[avec[i][k]] = 1;
    for (int j = 0; j <= t2; ++j) {
      for (int k = 0; k < bvec[j].size(); ++k) {
        if (close[bvec[j][k]] == 0) cost += p[bvec[j][k]];
      }
      fb[j][i] = cost;
    }
  }
  memset(close, 0, sizeof(close));
  ;
  long long int cost2;
  cost = 0;
  long long int tot = 0;
  for (int i = int(1); i <= (int)n; i++) tot += p[i];
  for (int i = 0; i <= t1; ++i) {
    cost2 = 0;
    for (int k = 0; k < avec[i].size(); ++k) {
      cost += p[avec[i][k]];
      close[avec[i][k]] = 1;
    }
    for (int j = 0; j <= t2; ++j) {
      for (int k = 0; k < bvec[j].size(); ++k)
        if (close[bvec[j][k]] == 0) cost2 += p[bvec[j][k]];
      bsum[i][j] = cost2 + cost;
    }
  }
  int mxa[2010] = {0}, mxb[2010] = {0};
  for (int i = int(1); i <= (int)t1; i++)
    for (int k = int(1); k <= (int)avec[i].size(); k++)
      for (int j = int(1); j <= (int)t2; j++)
        for (int k2 = int(1); k2 <= (int)bvec[j].size(); k2++)
          if (avec[i][k - 1] == bvec[j][k2 - 1]) mxa[i] = max(mxa[i], j);
  for (int i = int(1); i <= (int)t2; i++)
    for (int k = int(1); k <= (int)bvec[i].size(); k++)
      for (int j = int(1); j <= (int)t1; j++)
        for (int k2 = int(1); k2 <= (int)avec[j].size(); k2++)
          if (bvec[i][k - 1] == avec[j][k2 - 1]) mxb[i] = max(mxb[i], j);
  long long int sub;
  for (int i = t1; i >= 1; i--) {
    for (int j = t2; j >= 1; j--) {
      game[i][j][0] = game[i][j][1] = -inf;
      if (mxa[i] >= j)
        game[i][j][0] = fa[i][j - 1] - fa[i - 1][j - 1] +
                        (tot - bsum[i][j - 1]) - game[i + 1][j][1];
      if (mxb[j] >= i)
        game[i][j][1] = fb[j][i - 1] - fb[j - 1][i - 1] +
                        (tot - bsum[i - 1][j]) - game[i][j + 1][0];
      game[i][j][0] = max(game[i][j][0],
                          fa[i][j - 1] - fa[i - 1][j - 1] + game[i + 1][j][0]);
      game[i][j][1] = max(game[i][j][1],
                          fb[j][i - 1] - fb[j - 1][i - 1] + game[i][j + 1][1]);
    }
  }
  if (game[1][1][0] == tot - game[1][1][0])
    puts("Flowers");
  else if (game[1][1][0] > tot - game[1][1][0])
    puts("Break a heart");
  else
    puts("Cry");
  return 0;
}
