#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;

#define fi first
#define se second
#define repl(i,a,b) for(ll i=(ll)(a);i<(ll)(b);i++)
#define rep(i,n) repl(i,0,n)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout<<#x"="<<x<<endl
#define mmax(x,y) (x>y?x:y)
#define mmin(x,y) (x<y?x:y)
#define maxch(x,y) x=mmax(x,y)
#define minch(x,y) x=mmin(x,y)
#define uni(x) x.erase(unique(all(x)),x.end())
#define exist(x,y) (find(all(x),y)!=x.end())
#define bcnt __builtin_popcountll

#define INF 1e16
#define mod 1000000007

int A, B, C = ~(1<<31), Ma = (1<<16)-1;
int r() {
  A = 36969 * (A & Ma) + (A >> 16);
  B = 18000 * (B & Ma) + (B >> 16);
  return (C & ((A << 16) + B)) % 1000000;
}

ll M,N;
ll x[300001],y[300001],z[300001];
ll ord[300001],Y[300001],Z[300001];

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);

  while(1){
    cin>>M>>N>>A>>B;
    if(M+N==0)break;
    rep(i,M){
      cin>>x[i]>>y[i]>>z[i];
      ord[i]=i;
    }
    rep(i,N){
      x[i+M]=r(); y[i+M]=r(); z[i+M]=r(); ord[i+M]=i+M;
    }
    N+=M;
    sort(ord,ord+N,[](const ll& a,const ll& b){
      if(x[a]==x[b]&&y[a]==y[b])return z[a] > z[b];
      else if(x[a]==x[b])return y[a] > y[b];
      else return x[a] < x[b];
    });
    rep(i,N){
      Y[i]=y[ord[i]];
      Z[i]=z[ord[i]];
    }

    vector<set<P> > st(N,set<P>());
    ll res=1;
    st[0].insert(P(Y[0],Z[0]));
    repl(i,1,N){
      ll lb=-1,ub=res;
      while(ub-lb>1){
        ll m=(lb+ub)/2;
        auto it=st[m].lower_bound(P(Y[i],-1));
        if(it!=st[m].begin()&&(--it)->se<Z[i])lb=m;
        else ub=m;
      }

      maxch(res,ub+1);

      auto it=st[ub].lower_bound(P(Y[i],-1));
      while(it!=st[ub].end()&&it->se>=Z[i])it=st[ub].erase(it);

      it=st[ub].lower_bound(P(Y[i],-1));
      if(st[ub].size()==0)st[ub].insert(P(Y[i],Z[i]));
      else if(it->fi!=Y[i]){
        st[ub].insert(P(Y[i],Z[i]));
      }
    }
    cout<<res<<endl;
  }

  return 0;
}

