
import Data.Array
import Control.Monad
import Debug.Trace
import Data.List
import Data.Maybe

main = do
    [nX, nY] <- map read . words <$> getLine :: IO [Int]
    -- ms <- map (map read . words) <$> replicateM nX getLine :: IO [String]
    ms <- replicateM nX getLine :: IO [String]
    -- print $ ms
    let arr = listArray ((1,1),(nX,nY)) $ join ms
    -- print $ arr
    let black = [(x,y,nX,nY,[(-1,-1)]) | x<-[1..nX], y<-[1..nY], arr ! (x,y) == '#']
    -- print $ black
    -- print $ sum $ map (\x -> search x arr) black
    let ans = filter isJust . map (\x -> search x arr) $ black
    -- print $ ans
    if ans == [] then print 0 else print . sum . map (\x -> length . nub $ fromJust x) $ ans -- nub means Essence
    

search :: (Int,Int,Int,Int,[(Int,Int)]) -> Array (Int, Int) Char -> Maybe [(Int,Int)]
-- search (a,b,nX,nY,path) ms = trace ("(a,b,l,r,u,d) (" ++ show a ++ "," ++ show b ++ "," ++ show l ++ "," ++ show r ++ "," ++ show u ++ "," ++ show d ++ ")") $ mconcat [l_cell,r_cell,u_cell,d_cell]
search (a,b,nX,nY,path) ms = mconcat [l_cell,r_cell,u_cell,d_cell]
    where 
        mark = ms ! (a,b)
        -- Charを取得
        l = if b-1 /= 0 && not ((a, b-1) `elem` path) then ms ! (a, b-1) else 'O'
        r = if b+1 <= nY && not ((a, b+1) `elem` path) then ms ! (a, b+1) else 'O'
        u = if a-1 /= 0 && not ((a-1, b) `elem` path) then ms ! (a-1, b) else 'O'
        d = if a+1 <= nX && not ((a+1, b) `elem` path) then ms ! (a+1, b) else 'O'
        -- trace ("(a,b,l,r,u,d) (" ++ show a ++ "," ++ show b ++ "," ++ show l ++ "," ++ show r ++ "," ++ show u ++ "," ++ show d ++ ")") # ダメ
        l_cell = if l /= 'O' &&  l == change mark then search (a, b-1, nX, nY, (a, b) : path) ms else Nothing `mappend` canAdd mark (a,b)
        r_cell = if r /= 'O' &&  r == change mark then search (a, b+1, nX, nY, (a, b) : path) ms else Nothing -- `mappend` canAdd mark (a,b)
        u_cell = if u /= 'O' &&  u == change mark then search (a-1, b, nX, nY, (a, b) : path) ms else Nothing -- `mappend` canAdd mark (a,b)
        d_cell = if d /= 'O' &&  d == change mark then search (a+1, b, nX, nY, (a, b) : path) ms else Nothing -- `mappend` canAdd mark (a,b)

canAdd :: Char -> (Int,Int) -> Maybe [(Int,Int)]
canAdd x (a,b) = if x == '.' then Just [(a,b)] else Nothing

change :: Char -> Char
change x = if x == '#' then '.' else '#'