#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e16;
struct comp {
  bool operator()(pair<int, long long> a, pair<int, long long> b) {
    return a.second > b.second;
  }
};
bool comp2(pair<int, long long> a, pair<int, long long> b) {
  return a.second < b.second;
}
int N, M;
int n1, n2;
long long vals[2007];
vector<pair<int, long long> > connections[2007];
long long dist1[2007], dist2[2007];
int d1[2007], d2[2007];
vector<int> withDists1[2007], withDists2[2007];
vector<pair<int, long long> > dists1, dists2;
long long bestChoice1[2007], bestChoice2[2007];
bool foundAny1[2007], foundAny2[2007];
int max1, max2;
int main() {
  scanf("%d %d", &N, &M);
  scanf("%d %d", &n1, &n2);
  for (int i = 1; i <= N; i++) {
    scanf("%lld", vals + i);
    dist1[i] = inf;
    dist2[i] = inf;
  }
  for (int i = 0; i < M; i++) {
    int a, b;
    long long l;
    scanf("%d %d %lld", &a, &b, &l);
    connections[a].push_back(make_pair(b, l));
    connections[b].push_back(make_pair(a, l));
  }
  priority_queue<pair<int, long long>, vector<pair<int, long long> >, comp> pq1,
      pq2;
  dist1[n1] = 0;
  pq1.push(make_pair(n1, 0ll));
  while (!pq1.empty()) {
    auto curr = pq1.top();
    pq1.pop();
    int pos = curr.first;
    long long dist = curr.second;
    if (dist1[pos] != dist) {
      continue;
    }
    dists1.push_back(make_pair(pos, dist));
    for (int i = 0; i < connections[pos].size(); i++) {
      int p = connections[pos][i].first;
      long long len = connections[pos][i].second;
      if (dist1[p] > dist + len) {
        dist1[p] = dist + len;
        pq1.push(make_pair(p, dist + len));
      }
    }
  }
  dist2[n2] = 0;
  pq2.push(make_pair(n2, 0ll));
  while (!pq2.empty()) {
    auto curr = pq2.top();
    pq2.pop();
    int pos = curr.first;
    long long dist = curr.second;
    if (dist2[pos] != dist) {
      continue;
    }
    dists2.push_back(make_pair(pos, dist));
    for (int i = 0; i < connections[pos].size(); i++) {
      int p = connections[pos][i].first;
      long long len = connections[pos][i].second;
      if (dist2[p] > dist + len) {
        dist2[p] = dist + len;
        pq2.push(make_pair(p, dist + len));
      }
    }
  }
  sort(dists1.begin(), dists1.end(), comp2);
  sort(dists2.begin(), dists2.end(), comp2);
  long long pre1 = -1;
  int curr = 0;
  for (int i = 0; i < N; i++) {
    if (dists1[i].second != pre1) {
      pre1 = dists1[i].second;
      curr++;
    }
    d1[dists1[i].first] = curr;
    withDists1[curr].push_back(dists1[i].first);
  }
  max1 = curr;
  curr = 0;
  long long pre2 = -1;
  for (int i = 0; i < N; i++) {
    if (dists2[i].second != pre2) {
      pre2 = dists2[i].second;
      curr++;
    }
    d2[dists2[i].first] = curr;
    withDists2[curr].push_back(dists2[i].first);
  }
  max2 = curr;
  long long sol = 0;
  for (int v1 = max1; v1 >= 0; v1--) {
    for (int v2 = max2; v2 >= 0; v2--) {
      long long newChoice1, newChoice2;
      bool change1 = false, change2 = false;
      {
        long long toSub = 0;
        bool ok = false;
        for (int i = 0; i < withDists2[v2].size(); i++) {
          int pos = withDists2[v2][i];
          if (d1[pos] > v1) {
            ok = true;
            toSub += vals[pos];
          }
        }
        long long choice = bestChoice2[v2];
        if (v1 == 0 && v2 == 0) {
          sol = choice;
        }
        if (ok) {
          change1 = true;
          if (!foundAny1[v1]) {
            foundAny1[v1] = true;
            newChoice1 = choice - toSub;
          } else {
            newChoice1 = min(choice, bestChoice1[v1]) - toSub;
          }
        }
      }
      {
        long long toAdd = 0;
        bool ok = false;
        for (int i = 0; i < withDists1[v1].size(); i++) {
          int pos = withDists1[v1][i];
          if (d2[pos] > v2) {
            ok = true;
            toAdd += vals[pos];
          }
        }
        long long choice = bestChoice1[v1];
        if (ok) {
          change2 = true;
          if (!foundAny2[v2]) {
            foundAny2[v2] = true;
            newChoice2 = choice + toAdd;
          } else {
            newChoice2 = max(choice, bestChoice2[v2]) + toAdd;
          }
        }
      }
      if (change1) bestChoice1[v1] = newChoice1;
      if (change2) bestChoice2[v2] = newChoice2;
    }
  }
  if (sol < 0) {
    printf("Cry\n");
  } else if (sol == 0) {
    printf("Flowers\n");
  } else {
    printf("Break a heart\n");
  }
  return 0;
}
