program grdeg

    integer, allocatable :: A(:,:), B(:,:), ecc(:)
    
    read(*, *) n
    allocate(A(n,n), B(n,n), ecc(n))

    call rdmat(A, n)
    call connect(A, n, B)
    ecc = maxval(B, 1)
    irad = minval(ecc, ecc > 0)
    idia = maxval(ecc)
    
    print*, 'radius: ', irad
    print*, 'diameter: ', idia

contains
    subroutine prmat(A, n, d)
        character(len=40) ::  fmt
        integer, intent(in) :: n, d
        integer, intent(inout) :: A(n,n)
        write(fmt, '(A,I0,A,I0,A)') '(', n, '(I', d, ':,X))'
        write(*, fmt) ((A(j,i), j=1,n) ,i=1,n)
    end subroutine
    
    subroutine rdmat(A, n)
        integer, intent(inout) :: A(n,n)
        A = 0
        do
            read(*,*, end=1) i,j
            A(i,j) = A(i,j)+1
            A(j,i) = A(j,i)+1
        end do
    1   continue  
    end subroutine

    subroutine connect(A, n,  B)
        integer, intent(in) :: A(n,n)
        integer, intent(out):: B(n,n)
        integer:: C(n,n)
        B = 0
        C = A
    
        do i=1,n
            where (B == 0 .and. C > 0) B = i
            C = MATMUL(A,C)
        end do
        do i=1,n
           B(i,i) = 0
        end do
    end subroutine

    
end program
