class PQue

  def create_que(num=0)
    num.times do |i|
      eval("@qnum_#{i} = Array.new()")
    end
  end

  def qnum(num=0)
    eval("@qnum_#{num}")
  end

  def insert(num=0, x)
    que = eval("@qnum_#{num}")
    que << x
    que_idx = que.size - 1

    while que_idx != 0
      prt_idx = (que_idx - 1) / 2

      if que[prt_idx] < que[que_idx]
        que[prt_idx], que[que_idx] = que[que_idx], que[prt_idx]
      end

      que_idx = prt_idx
    end
  end

  def getmax(num=0)
    que = eval("@qnum_#{num}")
    puts(que[0]) unless que.empty?
  end

  def deletemax(num=0)
    que = eval("@qnum_#{num}")
    
    unless que.empty?
      lst_idx = que.size - 1

      if lst_idx == 0
        que.clear

      else
        que[0] = que.pop
        prt_idx = 0

        while (chr_idx = prt_idx * 2 + 1) < lst_idx

          unless que[chr_idx+1].nil?
            chr_idx += 1 if que[chr_idx] < que[chr_idx+1]
          end

          if que[chr_idx] > que[prt_idx]
            que[chr_idx], que[prt_idx] = que[prt_idx], que[chr_idx]
          end
          
          prt_idx = chr_idx
        end
      end
    end
  end

end

nq = gets.split.map(&:to_i)
que = PQue.new
que.create_que(nq[0])

nq[1].times do
  o, t, x = gets.split.map(&:to_i)
  case o
  when 0
    que.insert(t, x)
  when 1
    que.getmax(t)
  when 2
    que.deletemax(t)
  end
end
