#include <iostream>
#include <map>
#include <set>
#include <queue>

#define rep(i,s,t) for(int i=s;i<t;i++)
#define mp(a,b) make_pair(a,b)

using namespace std;

int main(void){
	int n;
	int id,u,a,p;

	//降順でkeyにスコア，Valueに 昇順でkeyにペナルティ valueに 昇順でKeyにid番号 valueに所属を保持する3重map
	//これを用いてスコアをソートする
	map<int,map<int,map<int,int> > ,greater<int> > ranking;
	//それぞれのチームの数を保持する配列
	int team[1001];
	//選ばれたチームのチームIDを保持するキュー
	queue<int> select;

	while(cin >> n){
		//スコアリストをクリアする
		ranking.clear();
		if(n==0) break;

		//それぞのチームのスコアを3重mapに挿入していく
		rep(i,0,n){
			cin >> id >> u >> a >> p ;
			//登場する大学のidのみを初期化する
			team[u]=0;
			ranking[a][p][id]=u;
		}
		//スコア順に並べた3重mapを上位から順に処理する
		bool interupt=false;
		for(map<int,map<int,map<int,int> >,greater<int> >::iterator it=ranking.begin();it!=ranking.end() && !interupt;it++){
			for(map<int,map<int,int> >::iterator jt=(*it).second.begin();jt!=(*it).second.end() && !interupt;jt++){
				for(map<int,int>::iterator kt=(*jt).second.begin();kt!=(*jt).second.end() && !interupt;kt++){
					int tid=(*kt).first;
					int tsc=(*kt).second;
					//tema数が10未満の場合
					if(select.size()<10){
						if(team[tsc]<3){
							select.push(tid);
							team[tsc]++;
						}
					//tema数が20未満の場合
					}else if(select.size()<20){
						if(team[tsc]<2){
							select.push(tid);
							team[tsc]++;
						}
					//tema数が26未満の場合
					}else if(select.size()<26){
						if(team[tsc]<1){
							select.push(tid);
							team[tsc]++;
						}
					//tema数が26を超えた場合はカウントを打ち切る
					}else{
						interupt=true;
					}
				}
			}

		}
		//キューを先頭から出力していく
		while(!select.empty()){
			cout << select.front() << endl;
			select.pop();
		}

	}

	return 0;
}