      #include<bits/stdc++.h>
      #include <ext/pb_ds/assoc_container.hpp>
      #include <ext/pb_ds/tree_policy.hpp>
      using namespace __gnu_pbds;
      using namespace std;
      #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
      #define ll            long long
      #define pb            push_back
      #define ppb           pop_back
      #define si            set <ll>
      #define endl          '\n'
      #define fr            first
      #define sc            second
      #define mii           map<ll,ll>
      #define msi           map<string,ll>
      #define mis           map<ll,string>
      #define rep(i,a,b)    for(ll  i=a;i<b;i++)
      #define all(v)        v.begin(),v.end()
      //#define sort(v)       sort(all(v))
      #define pii           pair<ll ,ll >
      #define vi            vector<ll >
      #define vii           vector<pair<ll,ll>>
      #define vs            vector<string>
      #define sz(x)         (ll)x.size()
      #define rt            return
      #define M             1000000007
      #define bs            binary_search
      #define rev(a)        reverse(all(a));
      #define sp(n)         setprecision(n)
      #define spl           " "
      #define arr(a,n)      rep(i,0,n) cin>>a[i]
      #define mod           998244353
      #define time          cout << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
      #define INF           1ll<<31
      #define hi            cout<<"hi"<<endl;
      void __print(int x) {cerr << x;}
      void __print(long x) {cerr << x;}
      void __print(long long x) {cerr << x;}
      void __print(unsigned x) {cerr << x;}
      void __print(unsigned long x) {cerr << x;}
      void __print(unsigned long long x) {cerr << x;}
      void __print(float x) {cerr << x;}
      void __print(double x) {cerr << x;}
      void __print(long double x) {cerr << x;}
      void __print(char x) {cerr << '\'' << x << '\'';}
      void __print(const char *x) {cerr << '\"' << x << '\"';}
      void __print(const string &x) {cerr << '\"' << x << '\"';}
      void __print(bool x) {cerr << (x ? "true" : "false");}
      template<typename T, typename V>
      void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
      template<typename T>
      void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
      void _print() {cerr << "]\n";}
      template <typename T, typename... V>
      void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
      #ifndef ONLINE_JUDGE
      #define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
      #else
      #define debug(x...)
      #endif
      ll bpow(ll a, ll b, ll mm = M)
      {
          ll res = 1;

          while(b)
          {
              if(b & 1)
                  res = (res * a) % mm;
              a = (a * a) % mm;

              b >>= 1;
          }

          return res;
      }
      ll modInverse(ll A,ll mm)
      {
          return bpow(A,mm-2,mm);
      }
      ll nCrModPFermat(ll n, ll r, ll p)
      {
         if (r==0)
            return 1;
          ll fac[n+1];
          fac[0] = 1;
          for (ll i=1 ; i<=n; i++)
              fac[i] = fac[i-1]*i%p;

          return (fac[n]*modInverse(fac[r],p)%p*modInverse(fac[n-r], p)%p)%p;
      }
      vector<ll> primeFactors(ll n)
    {

    vi v;
    while (n % 2 == 0)
    {
        v.pb(2);
        n = n/2;
    }
    for (ll i = 3; i <= sqrt(n); i = i + 2)
    {
        while (n % i == 0)
        {
            v.pb(i);
            n = n/i;
        }
    }

    if (n > 2)
        v.pb(n);
    return v;
}
    
      void solve()
      {
        ll n,k;
        cin>>n>>k;
        vi alice,bob,common;
        vi p,q;
        rep(i,0,n)
        {
          ll t,a,b;
          cin>>t>>a>>b;
          if(a==1 && b==0)
            {
              alice.pb(t);
              p.pb(t);
            }
          else if(a==0 && b==1)
            {
              bob.pb(t);
              q.pb(t);
            }
          else if(a==b && a==1)
          {
            common.pb(t);
            p.pb(t);
            q.pb(t);
          }
        }
        //debug(p,q);
        
        sort(all(alice));
        sort(all(bob));
        sort(all(common));
        //debug(alice,bob,common);
        
        rep(i,1,sz(alice)) alice[i]+=alice[i-1];
        rep(i,1,sz(bob)) bob[i]+=bob[i-1];
        rep(i,1,sz(common)) common[i]+=common[i-1];
        if(sz(p)<k|| sz(q)<k) cout<<-1<<endl;
        else
        {
          //debug(min(k,sz(common)));
          ll ans=2e16;
          ll res=0;
          //debug(alice,bob,common);
          rep(x,1,min(k,sz(common))+1)
          {
            res=0;
            if(sz(alice)>=k-x && sz(bob)>=k-x)
            {
              //debug(x);
              res+=common[x-1];
              if(sz(alice)>=k-x &&x!=k)
                res+=alice[k-x-1];
              if(sz(bob)>=k-x && x!=k)
                res+=bob[k-x-1];
              //debug(res);
              ans=min(ans,res);
            }

          }
          cout<<ans<<endl;
        }
        
      }

      signed main()
      {
          ios_base::sync_with_stdio(false);
          cin.tie(0);
          cout.tie(0);
          ll t=1;
          //cin>>t;
          while(t--) solve();
      }
