def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size,n=1,init=nil) #nに配列の次元数、sizeに配列の大きさ、initに初期値を投げることでその配列を返す
  if n==1
    return Array.new(size){init}
  else
    return Array.new(n).map{Array.new(size){init}}
  end
end

loop do
  n=gets.to_i
  break if n.zero?
  rank=array(n,1)
  part=array(10**3+1,1)
  excellence=array(10**3+1,1,0)
  all=0
  n.times do|i|
    l,u,a,p=get_i 
    rank[i]=[l,a,p]
    part[l]=u
  end
  rank.sort!{|x,y| x[0]<=>y[0]}
  rank.sort!{|x,y| x[2]<=>y[2]}
  rank.sort!{|x,y| y[1]<=>x[1]}
  
  i=0
  ans=[]
  while all<26  and i<n
    if all<10
      if excellence[part[rank[i][0]]]<3
        excellence[part[rank[i][0]]]+=1
        all+=1
        ans.push(rank[i][0])
      end
    elsif all<20
      if excellence[part[rank[i][0]]]<2
        excellence[part[rank[i][0]]]+=1
        all+=1
        ans.push(rank[i][0])
      end
    else
      if excellence[part[rank[i][0]]].zero?
        excellence[part[rank[i][0]]]+=1
        all+=1
        ans.push(rank[i][0])
      end
    end
    i+=1
  end
  puts ans.join("\n")
end
