import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.Array; import java.math.BigDecimal; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; import java.util.Set; import java.util.Stack; import java.util.TreeMap; import java.util.TreeSet; import static java.util.Comparator.*; public class Main { public static void main(String[] args) { PrintWriter out = new PrintWriter(System.out); Solver solver = new Solver(System.in, out); solver.solve(); out.close(); } } class Solver { Scanner sc; PrintWriter out; public Solver(InputStream in, PrintWriter out) { sc = new Scanner(in); this.out = out; } // ================================================================== int[] cnt = new int[10]; // [正解数] = 人数 MapList A = new MapList(); // Aの点数 → インデックスのリスト MapList B = new MapList(); // Bの点数 → インデックスのリスト int[] X = new int[100010]; // [インデックス] = その人の点数 public void solve() { // long start = System.currentTimeMillis(); int N = Integer.parseInt(sc.next()); int M = Integer.parseInt(sc.next()); int a, b; List list; for (int i = 0; i < N; i++) { X[i] = Integer.parseInt(sc.next()) + 1; // 初期値は a は必ず正解とする cnt[X[i]]++; a = Integer.parseInt(sc.next()); b = Integer.parseInt(sc.next()); A.add(a, i); B.add(b, i); } // A.dump(); // B.dump(); // for (int i = 0; i < 10; i++) { // out.println("cnt[" + i + "] = " + cnt[i]); // } int ans = 999999999; int sb = 100001; LOOP: for (int sa = 0; sa <= 100001; ) { while(cnt[2] + cnt[3] + cnt[4] + cnt[5] < M) { sb--; if(sb < 0) break LOOP; if(B.contains(sb)) { // out.println(" 1 SA = " + sa + " SB = " + sb); for(int index : B.getList(sb)) { // 見つかった人はBを正解になる // out.println(" SB = " + sb + " が見つかった[" + index + "]  元の正解数 = " + X[index] // + " 元の人数 = " + cnt[X[index]] + " 先の人数 = " + cnt[X[index]+1]); cnt[X[index]]--; // 元の正解数のカウントを減らす X[index]++; // 正解数を更新する cnt[X[index]]++; // 新しい更新数のカウントを増やす } } } ans = Math.min(ans, cnt[3] + cnt[4] + cnt[5]); // 3問以上の最小人数を取得する if(A.contains(sa)) { // out.println(" 2 SA = " + sa + " SB = " + sb); for(int index : A.getList(sa)) { // 見つかった人はAを不正解になる // out.println(" SA = " + sa + " が見つかった[" + index + "]  元の正解数 = " + X[index] // + " 元の人数 = " + cnt[X[index]] + " 先の人数 = " + cnt[X[index]-1]); cnt[X[index]]--; // 元の正解数のカウントを減らす X[index]--; // 正解数を更新する cnt[X[index]]++; // 新しい更新数のカウントを増やす } } sa++; // SAを更新する } out.println(ans); // long end = System.currentTimeMillis(); // out.println("実行時間[" + (end - start) + "]"); } // -------------------------------------- // Integer のキーに対して、Integer のリストを管理する class MapList { private HashMap> map; // 昇順のマップ public MapList() { map = new HashMap<>(); } // // reverse = tree なら降順のマップ // public MapList(boolean reverse) { // if(reverse) { // map = new TreeMap>(Collections.reverseOrder()); // } else { // map = new TreeMap<>(); // } // } // 値の追加 public void add(Integer key, Integer val) { List list = map.get(key); if(list == null) { list = new ArrayList<>(); map.put(key, list); } list.add(val); } // 値の削除 public void del(Integer key, Integer val) { List list = map.get(key); if(list == null) return; list.remove(val); if(list.isEmpty()) map.remove(key); } // データが空か? public boolean isEmpty() { return map.isEmpty(); } // キーセットを返す public Set keySet() { return map.keySet(); } // キーの要素があれば true を返す public boolean contains(Integer key) { if(map.get(key) == null) return false; else return true; } // リストの取得(なければ null を返す) public List getList(Integer key) { return map.get(key); } // ダンプ public void dump() { List list; out.println("------------ dump start -------------"); for(int key : map.keySet()){ list = map.get(key); out.println("key = " + key); for (int val : list) { out.print(" " + val); } out.println(""); } out.println("------------ dump end -------------"); } } }