#include <iostream>
#include <vector>
#include <utility>
using namespace std;
int iloscPracownikow;
int bezposredniPrzlozony[1000002];
int pensja[1000002];
vector < vector <int> > spisPrzelozonych;
int iloscPodwladnych[1000002];
int pozycjaSzefa;
bool niejedno[1000002];
int podDrzewa[1000002];
vector <int> p;
vector <int> k;
int pStop;
int kStop;
vector <int> listaK;
int zliczPodwladnych(int a){
int podwladni = spisPrzelozonych.at(a).size();
for (int i=0;i<spisPrzelozonych.at(a).size();i++){
podwladni=podwladni+zliczPodwladnych(spisPrzelozonych.at(a).at(i));
}
iloscPodwladnych[a]=podwladni;
return podwladni;
}
void przypisz(int pracownik){
if(niejedno[listaK.at(listaK.size()-1)]==false){
pensja[pracownik]=listaK.back();
listaK.pop_back();
}
if(spisPrzelozonych.at(pracownik).size()==1)
przypisz(spisPrzelozonych.at(pracownik).at(0));
}
int main() {
cin >> iloscPracownikow;
spisPrzelozonych.resize(1000002);
pStop=0;
kStop=0;
for(int i=1;i<=iloscPracownikow;i++){
int przelozony;
int pen;
cin >> przelozony;
cin >> pen;
if(przelozony==i){
pensja[i]=iloscPracownikow;
pozycjaSzefa=i;
}
else{
bezposredniPrzlozony[i]=przelozony;
spisPrzelozonych.at(przelozony).push_back(i);
pensja[i]=pen;
}
}
/*for(int i=1;i<=iloscPracownikow;i++)
cout<<bezposredniPrzlozony[i]<<" "<<pensja[i]<<" "<<endl;*/
zliczPodwladnych(pozycjaSzefa);
/*for(int i=1;i<=iloscPracownikow;i++)
cout<<iloscPodwladnych[i]<<endl;
cout<<endl;*/
for(int i=1;i<=iloscPracownikow;i++){
niejedno[i]=false;
}
for(int i=1;i<=iloscPracownikow;i++){
if(pensja[i]==0 && pensja[bezposredniPrzlozony[i]]!=0)
podDrzewa[pensja[bezposredniPrzlozony[i]]]=i;
}
/*for(int i=1;i<=iloscPracownikow;i++)
cout<<podDrzewa[i]<<endl;
cout<<endl;*/
for(int i=1;i<=iloscPracownikow;i++){
if (pensja[i]==0){
k.push_back(i);
p.push_back(i);
}
}
for(int i=1;i<=iloscPracownikow;i++)
cout<<p.at(i)<<" "<<k.at(i)<<endl;
cout<<endl;
for(int i=0;i<iloscPracownikow;i++){
if(podDrzewa[i]==0){
for(int x=0;x<spisPrzelozonych.at(podDrzewa[i]).size();x++){
if(pensja[podDrzewa[i]]==0){
listaK.clear();
for(int a=0;a<iloscPodwladnych[podDrzewa[i]];a++){
listaK.push_back(k.at(0));
k.erase(p.begin());
}
if(k.size()==0||k.at(0)>i){
if(niejedno[listaK.at(listaK.size()-1)]==false){
przypisz(podDrzewa[i]);
}
}
else{
while(p.size()!=0&&p.at(0)<i){
niejedno[p.at(0)]=true;
p.erase(p.begin());
}
}
}
}
}
}
for(int i=1;i<=iloscPracownikow;i++)
cout<<pensja[i]<<endl;
}