def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size1,init=nil,size2=-1) #size2に二次元配列時の最初の要素数、size1に次の配列の大きさ、initに初期値を投げることでその配列を返す
  if size2==-1
    return Array.new(size1){init}
  else
    return Array.new(size2){Array.new(size1){init}}
  end
end
class Pos
    attr_accessor:x,:y
end

Direct=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]]
loop do
w,h=get_i
break if w.zero? and h.zero?
c=array(h)
h.times do|i|
    c[i]=get_i
end
$seen=array(w,false,h)
def bfs(map,pos,w,h)
  queue=[]
  queue.push(pos)
  $seen[pos.y][pos.x]=true
  until queue==[]
    curr_p=queue.shift
    Direct.each do|x,y|
        next_p=Pos.new
        next_p.x,next_p.y=curr_p.x+x,curr_p.y+y
        next unless next_p.x.between?(0,w-1) and next_p.y.between?(0,h-1) and map[next_p.y][next_p.x]==1 and not $seen[next_p.y][next_p.x]
        $seen[next_p.y][next_p.x]=true
        queue.push(next_p)
    end
  end
end
pos=Pos.new
ans=0
h.times do|i|
    w.times do|j|
      pos.x,pos.y=j,i
      if c[i][j]==1 and not $seen[i][j]
        ans+=1
        bfs(c,pos,w,h)    
      end
    end
end
puts ans
end
