func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 2010;   struct edge {     int to, next, w;   } e[200010];   int head[N], ecnt, n, vis[N], val[N], mark[N][N];   long long dp[2][N][N], cover[N][N], sum;   inline void adde(int from, int to, int w) {     e[++ecnt] = (edge){to, head[from], w}, head[from] = ecnt;     e[++ecnt] = (edge){from, head[to], w}, head[to] = ecnt;   }   inline void Dijkstra(long long d[], int s) {     for (int i = 1; i <= n; i++) d[i] = 1e18;     memset(vis, 0, sizeof(vis));     priority_queue<pair<long long, int> > q;     q.push(pair<long long, int>(0, s)), d[s] = 0;     while (!q.empty()) {       int u = q.top().second;       q.pop();       if (vis[u]) continue;       vis[u] = 1;       for (int i = head[u]; i; i = e[i].next)         if (!vis[e[i].to] && d[u] + e[i].w < d[e[i].to])           d[e[i].to] = d[u] + e[i].w,           q.push(pair<long long, int>(-d[e[i].to], e[i].to));     }   }   inline void work(int s, int t) {     static long long S[N], T[N], tmp[N];     Dijkstra(S, s), Dijkstra(T, t);     int top = 0;     for (int i = 1; i <= n; i++) tmp[++top] = S[i];     sort(tmp + 1, tmp + top + 1), top = unique(tmp + 1, tmp + top + 1) - tmp - 1;     for (int i = 1; i <= n; i++)       S[i] = lower_bound(tmp + 1, tmp + top + 1, S[i]) - tmp;     top = sum = 0;     for (int i = 1; i <= n; i++) tmp[++top] = T[i];     sort(tmp + 1, tmp + top + 1), top = unique(tmp + 1, tmp + top + 1) - tmp - 1;     for (int i = 1; i <= n; i++) sum += val[i];     for (int i = 1; i <= n; i++)       T[i] = lower_bound(tmp + 1, tmp + top + 1, T[i]) - tmp;     for (int i = 1; i <= n; i++)       cover[S[i] - 1][T[i] - 1] -= val[i], mark[S[i] - 1][T[i] - 1] = -1;     for (int i = n; i >= 0; i--)       for (int j = n; j >= 0; j--) {         cover[i][j] += cover[i + 1][j] + cover[i][j + 1] - cover[i + 1][j + 1];         mark[i][j] += mark[i + 1][j] + mark[i][j + 1] - mark[i + 1][j + 1];       }     for (int i = 0; i <= n; i++)       for (int j = 0; j <= n; j++) cover[i][j] += sum, mark[i][j] += n;   }   int nxt[2][N][N];   long long f[N][N], g[N][N];   int main() {     int m, s, t;     scanf( %d%d%d%d , &n, &m, &s, &t);     for (int i = 1; i <= n; i++) scanf( %d , &val[i]);     for (int i = 1, a, b, c; i <= m; i++)       scanf( %d%d%d , &a, &b, &c), adde(a, b, c);     work(s, t);     for (int i = 0; i <= n + 1; i++)       for (int j = 0; j <= n + 1; j++) f[i][j] = g[i][j] = -1e18;     for (int i = n; i >= 0; i--)       for (int j = n; j >= 0; j--) {         if (mark[i][j] != mark[i + 1][j])           nxt[1][i][j] = i + 1;         else           nxt[1][i][j] = nxt[1][i + 1][j];         if (mark[i][j] != mark[i][j + 1])           nxt[0][i][j] = j + 1;         else           nxt[0][i][j] = nxt[0][i][j + 1];       }     for (int i = n; i >= 0; i--)       for (int j = n; j >= 0; j--) {         f[i][j] = f[i + 1][j], g[i][j] = g[i][j + 1];         if (cover[i][j] == sum)           dp[0][i][j] = dp[1][i][j] = 0;         else           dp[1][i][j] = f[nxt[1][i][j]][j] - cover[i][j],           dp[0][i][j] = g[i][nxt[0][i][j]] - cover[i][j];         f[i][j] = max(f[i][j], cover[i][j] - dp[0][i][j]),         g[i][j] = max(g[i][j], cover[i][j] - dp[1][i][j]);       }     long long w = dp[1][0][0];     if (w == 0)       puts( Flowers );     else       puts(w > 0 ?  Break a heart  :  Cry );     return 0;   }   