#include <bits/stdc++.h>
using namespace std;
const int NN = 2000 + 117;
const int MM = 1000 + 117;
int read() {
  int fl = 1, x;
  char c;
  for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar())
    ;
  if (c == '-') {
    fl = -1;
    c = getchar();
  }
  for (x = 0; c >= '0' && c <= '9'; c = getchar())
    x = (x << 3) + (x << 1) + c - '0';
  return x * fl;
}
void open() { freopen("a.in", "r", stdin); }
void close() {
  fclose(stdin);
  fclose(stdout);
}
int m, n;
struct edge {
  long long len;
  int to;
};
vector<edge> p[NN] = {};
long long sp[2][NN] = {};
long long li[2][NN] = {};
long long lcnt[2] = {};
long long a[NN] = {};
long long all[NN][NN] = {};
long long cnt[NN][NN] = {};
long long dp[NN][NN][2] = {};
long long s1, s2;
vector<int> pt[2][NN] = {};
bool vis[NN] = {};
long long pre[NN][NN][2] = {};
int xt[NN][NN][2] = {};
int glob = 0;
struct cmp {
  bool operator()(int a, int b) { return sp[glob][a] > sp[glob][b]; }
};
priority_queue<int, vector<int>, cmp> q;
bool inq[NN] = {};
void getsp(int id, int st) {
  glob = id;
  memset(sp[id], 60, sizeof sp[id]);
  sp[id][st] = 0;
  q.push(st);
  while (!q.empty()) {
    int x = q.top();
    q.pop();
    inq[x] = 0;
    for (int i = 0; i < p[x].size(); ++i) {
      int cur = p[x][i].to;
      if (sp[id][cur] > sp[id][x] + p[x][i].len) {
        sp[id][cur] = sp[id][x] + p[x][i].len;
        if (!inq[cur]) {
          inq[cur] = 1;
          q.push(cur);
        }
      }
    }
  }
}
int main() {
  n = read();
  m = read();
  s1 = read(), s2 = read();
  long long sum = 0;
  for (int i = 1; i <= n; ++i) a[i] = read(), sum += a[i];
  for (int i = 1; i <= m; ++i) {
    int x = read(), y = read();
    edge tp;
    tp.len = read();
    tp.to = y;
    p[x].push_back(tp);
    tp.to = x;
    p[y].push_back(tp);
  }
  getsp(0, s1);
  getsp(1, s2);
  for (int i = 1; i <= n; ++i) {
    li[0][i] = sp[0][i];
    li[1][i] = sp[1][i];
  }
  sort(li[0] + 1, li[0] + 1 + n);
  sort(li[1] + 1, li[1] + 1 + n);
  lcnt[0] = unique(li[0] + 1, li[0] + 1 + n) - li[0] - 1;
  lcnt[1] = unique(li[1] + 1, li[1] + 1 + n) - li[1] - 1;
  for (int i = 1; i <= n; ++i) {
    int c = lower_bound(li[0] + 1, li[0] + 1 + lcnt[0], sp[0][i]) - li[0];
    pt[0][c].push_back(i);
    c = lower_bound(li[1] + 1, li[1] + 1 + lcnt[1], sp[1][i]) - li[1];
    pt[1][c].push_back(i);
  }
  long long v1 = 0;
  long long c1 = 0;
  for (int i = 0; i <= lcnt[0]; ++i) {
    for (int j = 0; j < pt[0][i].size(); ++j) {
      int cur = pt[0][i][j];
      v1 += a[cur];
      ++c1;
      vis[cur] = 1;
    }
    long long v = v1;
    long long c = c1;
    for (int j = 0; j <= lcnt[1]; ++j) {
      for (int k = 0; k < pt[1][j].size(); ++k) {
        int cur = pt[1][j][k];
        if (!vis[cur]) v += a[cur], ++c;
      }
      all[i][j] = sum - v;
      cnt[i][j] = n - c;
    }
  }
  dp[lcnt[0]][lcnt[1]][1] = 0;
  dp[lcnt[0]][lcnt[1]][0] = 0;
  for (int i = lcnt[0]; i >= 0; --i) {
    for (int j = lcnt[1]; j >= 0; --j) {
      if (cnt[i][j] == cnt[i + 1][j]) {
        xt[i][j][0] = xt[i + 1][j][0];
      } else
        xt[i][j][0] = i + 1;
      if (cnt[i][j] == cnt[i][j + 1]) {
        xt[i][j][1] = xt[i][j + 1][1];
      } else
        xt[i][j][1] = j + 1;
    }
  }
  for (int s = lcnt[0] + lcnt[1] - 1; s >= 0; --s) {
    for (int i = 0; i <= s && i <= lcnt[0]; ++i) {
      int j = s - i;
      if (j > lcnt[1]) continue;
      dp[i][j][0] = all[i][j] - pre[xt[i][j][0]][j][1];
      dp[i][j][1] = all[i][j] - pre[i][xt[i][j][1]][0];
      pre[i][j][0] = min(dp[i][j][0], pre[i][j + 1][0]);
      pre[i][j][1] = min(dp[i][j][1], pre[i + 1][j][1]);
    }
  }
  if (sum - dp[0][0][0] < dp[0][0][0]) {
    printf("Break a heart\n");
  } else if (sum - dp[0][0][0] == dp[0][0][0]) {
    printf("Flowers\n");
  } else
    printf("Cry\n");
  close();
  return 0;
}
