class  Grapg< T >   { 
  
  verteces:  T [ ]  =  [ ] ; 
  
  adjList:  Map< T ,  T [ ] >  =  new  Map ( ) ; 
  
  addVertex ( v:  T )  { 
    this . verteces. push ( v) ; 
    
    this . adjList. set ( v,  [ ] ) ; 
  } 
  
  addEdge ( v:  T ,  w:  T )  { 
    
    this . adjList. get ( v) ?. push ( w) ; 
    
    this . adjList. get ( w) ?. push ( v) ; 
  } 
  
  printEdges ( )  { 
    
    this . verteces. forEach ( ( vertex)  =>  { 
      
      console . log ( ` ${ vertex}  ->  ${ this . adjList. get ( vertex) ?. join ( ' ' ) } ` ) ; 
    } ) ; 
  } 
  
  BFS ( )  { 
    if  ( this . verteces. length ===  0 )  return ; 
    const  visited =  new  Set< T >  ( ) ;  
    visited. add ( this . verteces[ 0 ] ) ;  
    const  queue =  [ this . verteces[ 0 ] ] ;  
    
    while  ( queue. length)  { 
      const  v =  queue. shift ( ) ! ;  
      console . log ( v) ;  
      const  vEdges =  this . adjList. get ( v) ;  
      
      if  ( ! vEdges)  continue ; 
      
      for  ( const  e of  vEdges)  { 
        
        if  ( ! visited. has ( e) )  { 
          visited. add ( e) ; 
          queue. push ( e) ; 
        } 
      } 
    } 
  } 
  
  DFS ( )  { 
    if  ( this . verteces. length ===  0 )  return ; 
    const  visited =  new  Set< T >  ( ) ;  
    visited. add ( this . verteces[ 0 ] ) ;  
    const  stack =  [ this . verteces[ 0 ] ] ;  
    
    while  ( stack. length)  { 
      const  v =  stack. pop ( ) ! ;  
      console . log ( v) ;  
      const  vEdges =  this . adjList. get ( v) ;  
      if  ( ! vEdges)  return ;  
      
      for  ( let  i =  vEdges. length -  1 ;  i >=  0 ;  i-- )  { 
        const  e =  vEdges[ i] ;  
        
        if  ( ! visited. has ( e) )  { 
          stack. push ( e) ; 
          visited. add ( e) ; 
        } 
      } 
    } 
  } 
} 
const  graph =  new  Grapg< string >  ( ) ; 
for  ( let  i =  0 ;  i <  9 ;  i++ )  { 
  graph. addVertex ( String. fromCharCode ( 65  +  i) ) ; 
} 
graph. addEdge ( 'A' ,  'B' ) ; 
graph. addEdge ( 'A' ,  'C' ) ; 
graph. addEdge ( 'A' ,  'D' ) ; 
graph. addEdge ( 'C' ,  'D' ) ; 
graph. addEdge ( 'C' ,  'G' ) ; 
graph. addEdge ( 'D' ,  'G' ) ; 
graph. addEdge ( 'D' ,  'H' ) ; 
graph. addEdge ( 'B' ,  'E' ) ; 
graph. addEdge ( 'B' ,  'F' ) ; 
graph. addEdge ( 'E' ,  'I' ) ; 
graph. printEdges ( ) ; 
console . log ( 'BFS' ) ; 
graph. BFS ( ) ; 
console . log ( 'DFS' ) ; 
graph. DFS ( ) ;