N, M = readline.split(' ').map(&:to_i)
Edges = Hash.new {|h,k| h[k]=Hash.new }

M.times do |idx|
  n1, n2, dist = readline.split(' ').map(&:to_i)
  Edges[n1-1][n2-1] = [dist, idx]
  Edges[n2-1][n1-1] = [dist, idx]
end

class Path
  attr_reader :distance, :node_seq
  def initialize(distance, node_seq)
    @distance = distance
    @node_seq = node_seq
  end
end

def find_a_path_leq(src, dest, max)
  sorted_paths = [Path.new(0, [src])] # sorted_paths: [Path] sorted by Path.distance
  shortest_path_length = 1<<64

  while head = sorted_paths.shift
    if head.distance >= max
      return nil
    end

    if head.node_seq[-1]==dest
      return head.node_seq
      next
    end

    new_paths = []
    Edges[head.node_seq[-1]].each do |dest, edge|
      distance, idx = *edge
      p = Path.new(head.distance + distance, head.node_seq+[dest])
      new_paths.push(p)
    end

    sorted_paths.append(*new_paths)
    sorted_paths.sort_by!(&:distance)
  end
end


count=0
Edges.keys.sort.each do |src|
  Edges[src].keys.sort.each do |dst|
    if src<=dst then
      break
    end

    e = Edges[src][dst]
    if find_a_path_leq(src, dst, e[0])
      count += 1
    end
  end
end

puts count


