'use strict';
(function(input){
  input=input.trim().split(/\n/).map(str=>str.split(/\s+/).map(x=>x-0));
  const N=input[0][0];
  const M=input[0][1];
  input.shift();
  
  const Node=function(idx){
    var t=this;
    t.index=idx;
    t.children=[];
    t.scanned=false;
    t.height=0;
  }
    
  const nodes=new Array(N+1).fill(0).map((x,i)=>new Node(i));
  //console.log(nodes);
  input.forEach(function(xy){
    var p=xy[0],c=xy[1];
    nodes[p].children.push(nodes[c]);
  });
  //console.log(nodes);
  var ans=0;
  var i=1;
  while(i<=N){
    if(nodes[i].scanned){
      ans=Math.max(ans,nodes[i].height);
      i++;
      continue;
    }
    let I=i;
    while(nodes[I].children.length>0){
      if(nodes[I].children[nodes[I].children.length-1].scanned){
        nodes[I].height=Math.max(nodes[I].height,nodes[I].children.pop().height+1);
      }else{
        I=nodes[I].children[nodes[I].children.length-1].index;
      }
    }
    nodes[I].scanned=true;
  }
  //console.log(nodes);
  console.log(ans);
})(require('fs').readFileSync('/dev/stdin','utf8'));
