#include <iostream>
#include <vector>
#include <limits>
class Tree {
struct Node {
int id;
std::vector<Node*> children;
Node(int id) : id(id) {}
};
public:
Tree(int id = 0) : mRoot(new Node(id)) {}
inline Node* find(int id) const { return find_impl(mRoot, id); }
inline int getHeight() const { return getHeight_impl(mRoot); }
inline void insert(int parent_id, int child_id) {
Node* parent = find(parent_id);
if (parent == nullptr) return;
parent->children.push_back(new Node(child_id));
}
private:
Node* find_impl(Node* curr, int id) const {
if (curr == nullptr || curr->id == id) return curr;
for (const auto& child : curr->children) {
auto it = find_impl(child, id);
if (it != nullptr) return it;
}
return nullptr;
}
int getHeight_impl(Node* curr) const {
if (curr == nullptr) return 0;
int maxHeight = std::numeric_limits<int>::min();
for (const auto& child : curr->children) maxHeight = std::max(maxHeight, getHeight_impl(child));
return maxHeight + 1;
}
Node* mRoot = nullptr;
};
int main(void) {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int node_count;
std::cin >> node_count;
Tree tree(0);
std::pair<int, int> tmp;
for (int node_ind = 0; node_ind < node_count - 1; ++node_ind) {
std::cin >> tmp.first >> tmp.second;
tree.insert(tmp.first, tmp.second);
}
std::cout << tree.getHeight() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGltaXRzPgoKCmNsYXNzIFRyZWUgewogICAgc3RydWN0IE5vZGUgewogICAgICAgIGludCBpZDsKICAgICAgICBzdGQ6OnZlY3RvcjxOb2RlKj4gY2hpbGRyZW47CgogICAgICAgIE5vZGUoaW50IGlkKSA6IGlkKGlkKSB7fQogICAgfTsKCiAgICBwdWJsaWM6CiAgICAgICAgVHJlZShpbnQgaWQgPSAwKSA6IG1Sb290KG5ldyBOb2RlKGlkKSkge30KCiAgICAgICAgaW5saW5lIE5vZGUqIGZpbmQoaW50IGlkKSBjb25zdCB7IHJldHVybiBmaW5kX2ltcGwobVJvb3QsIGlkKTsgfQogICAgICAgIGlubGluZSBpbnQgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gZ2V0SGVpZ2h0X2ltcGwobVJvb3QpOyB9CgogICAgICAgIGlubGluZSB2b2lkIGluc2VydChpbnQgcGFyZW50X2lkLCBpbnQgY2hpbGRfaWQpIHsKICAgICAgICAgICAgTm9kZSogcGFyZW50ID0gZmluZChwYXJlbnRfaWQpOwogICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHJldHVybjsKICAgICAgICAgICAgcGFyZW50LT5jaGlsZHJlbi5wdXNoX2JhY2sobmV3IE5vZGUoY2hpbGRfaWQpKTsKICAgICAgICB9CgogICAgcHJpdmF0ZToKICAgICAgICBOb2RlKiBmaW5kX2ltcGwoTm9kZSogY3VyciwgaW50IGlkKSBjb25zdCB7CiAgICAgICAgICAgIGlmIChjdXJyID09IG51bGxwdHIgfHwgY3Vyci0+aWQgPT0gaWQpIHJldHVybiBjdXJyOwogICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNoaWxkIDogY3Vyci0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBmaW5kX2ltcGwoY2hpbGQsIGlkKTsKICAgICAgICAgICAgICAgIGlmIChpdCAhPSBudWxscHRyKSByZXR1cm4gaXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgfQoKICAgICAgICBpbnQgZ2V0SGVpZ2h0X2ltcGwoTm9kZSogY3VycikgY29uc3QgewogICAgICAgICAgICBpZiAoY3VyciA9PSBudWxscHRyKSByZXR1cm4gMDsKCiAgICAgICAgICAgIGludCBtYXhIZWlnaHQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNoaWxkIDogY3Vyci0+Y2hpbGRyZW4pIG1heEhlaWdodCA9IHN0ZDo6bWF4KG1heEhlaWdodCwgZ2V0SGVpZ2h0X2ltcGwoY2hpbGQpKTsKICAgICAgICAgICAgcmV0dXJuIG1heEhlaWdodCArIDE7CiAgICAgICAgfQoKICAgICAgICBOb2RlKiBtUm9vdCA9IG51bGxwdHI7Cn07CgppbnQgbWFpbih2b2lkKSB7CiAgICBzdGQ6Omlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgc3RkOjpjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBub2RlX2NvdW50OwogICAgc3RkOjpjaW4gPj4gbm9kZV9jb3VudDsKCiAgICBUcmVlIHRyZWUoMCk7CiAgICBzdGQ6OnBhaXI8aW50LCBpbnQ+IHRtcDsKCiAgICBmb3IgKGludCBub2RlX2luZCA9IDA7IG5vZGVfaW5kIDwgbm9kZV9jb3VudCAtIDE7ICsrbm9kZV9pbmQpIHsKICAgICAgICBzdGQ6OmNpbiA+PiB0bXAuZmlyc3QgPj4gdG1wLnNlY29uZDsKICAgICAgICB0cmVlLmluc2VydCh0bXAuZmlyc3QsIHRtcC5zZWNvbmQpOwogICAgfQoKICAgIHN0ZDo6Y291dCA8PCB0cmVlLmdldEhlaWdodCgpIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9