Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "sort"8)9 1011func CF808F(_r io.Reader, _w io.Writer) {12 in := bufio.NewReader(_r)13 out := bufio.NewWriter(_w)14 defer out.Flush()15 const inf int = 1e916 type card struct{ p, c, l int }17 type neighbor struct{ to, rid, cap int }18 min := func(a, b int) int {19 if a < b {20 return a21 }22 return b23 }24 const mx int = 2e525 isP := [mx + 1]bool{}26 for i := range isP {27 isP[i] = true28 }29 for i := 2; i <= mx; i++ {30 if isP[i] {31 for j := 2 * i; j <= mx; j += i {32 isP[j] = false33 }34 }35 }36 37 var n, minP int38 Fscan(in, &n, &minP)39 a := make([]card, n)40 for i := range a {41 Fscan(in, &a[i].p, &a[i].c, &a[i].l)42 }43 ans := sort.Search(n+1, func(upL int) bool {44 g := make([][]neighbor, n+3)45 addEdge := func(from, to, cap int) {46 g[from] = append(g[from], neighbor{to, len(g[to]), cap})47 g[to] = append(g[to], neighbor{from, len(g[from]) - 1, 0})48 }49 st, end, sumP, mxI := n+1, n+2, 0, -150 for i, c := range a {51 if c.l <= upL && c.c == 1 && (mxI == -1 || c.p > a[mxI].p) {52 mxI = i53 }54 }55 56 57 for i, c := range a {58 if c.l > upL || c.c == 1 && i != mxI {59 continue60 }61 sumP += c.p62 if c.c&1 > 0 {63 addEdge(st, i, c.p)64 for j, d := range a {65 if d.l <= upL && d.c&1 == 0 && isP[c.c+d.c] {66 addEdge(i, j, inf)67 }68 }69 } else {70 addEdge(i, end, c.p)71 }72 }73 74 d := make([]int, n+3)75 bfs := func() bool {76 for i := range d {77 d[i] = -178 }79 d[st] = 080 q := []int{st}81 for len(q) > 0 {82 v := q[0]83 q = q[1:]84 for _, e := range g[v] {85 if w := e.to; e.cap > 0 && d[w] < 0 {86 d[w] = d[v] + 187 q = append(q, w)88 }89 }90 }91 return d[end] >= 092 }93 var iter []int94 var dfs func(int, int) int95 dfs = func(v, minF int) int {96 if v == end {97 return minF98 }99 for ; iter[v] < len(g[v]); iter[v]++ {100 e := &g[v][iter[v]]101 if w := e.to; e.cap > 0 && d[w] > d[v] {102 if f := dfs(w, min(minF, e.cap)); f > 0 {103 e.cap -= f104 g[w][e.rid].cap += f105 return f106 }107 }108 }109 return 0110 }111 for bfs() {112 iter = make([]int, n+3)113 for {114 if f := dfs(st, inf); f > 0 {115 sumP -= f 116 } else {117 break118 }119 }120 }121 return sumP >= minP122 })123 if ans > n {124 ans = -1125 }126 Fprint(out, ans)127}128 129130