Problem:
Score : 400 points

Problem Statement

You are given an undirected connected weighted graph with N vertices and M edges that contains neither self-loops nor double edges.

The i-th (1≤i≤M) edge connects vertex a_i and vertex b_i with a distance of c_i.

Here, a self-loop is an edge where a_i = b_i (1≤i≤M), and double edges are two edges where (a_i,b_i)=(a_j,b_j) or (a_i,b_i)=(b_j,a_j) (1≤i<j≤M).

A connected graph is a graph where there is a path between every pair of different vertices.

Find the number of the edges that are not contained in any shortest path between any pair of different vertices.

Constraints

2≤N≤100

N-1≤M≤min(N(N-1)/2,1000)

1≤a_i,b_i≤N

1≤c_i≤1000

c_i is an integer.

The given graph contains neither self-loops nor double edges.

The given graph is connected.

Input

The input is given from Standard Input in the following format:

N M
a_1 b_1 c_1
a_2 b_2 c_2
:
a_M b_M c_M

Output

Print the number of the edges in the graph that are not contained in any shortest path between any pair of different vertices.

Sample Input 1

3 3
1 2 1
1 3 1
2 3 3

Sample Output 1

1

In the given graph, the shortest paths between all pairs of different vertices are as follows:

The shortest path from vertex 1 to vertex 2 is: vertex 1 → vertex 2, with the length of 1.

The shortest path from vertex 1 to vertex 3 is: vertex 1 → vertex 3, with the length of 1.

The shortest path from vertex 2 to vertex 1 is: vertex 2 → vertex 1, with the length of 1.

The shortest path from vertex 2 to vertex 3 is: vertex 2 → vertex 1 → vertex 3, with the length of 2.

The shortest path from vertex 3 to vertex 1 is: vertex 3 → vertex 1, with the length of 1.

The shortest path from vertex 3 to vertex 2 is: vertex 3 → vertex 1 → vertex 2, with the length of 2.

Thus, the only edge that is not contained in any shortest path, is the edge of length 3 connecting vertex 2 and vertex 3, hence the output should be 1.

Sample Input 2

3 2
1 2 1
2 3 1

Sample Output 2

0

Every edge is contained in some shortest path between some pair of different vertices.

Solution in Ruby (2.3.3) (judge verdict: Wrong Answer)

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

# flooding
minimum_distance_matrix = Array.new(N) {Array.new(N)}
N.times do |i|
  minimum_distance_matrix[i][i]=0
end

N.times do
  Edges.each_pair do |src, h|
    h.each_pair do |dst, edge|
      N.times do |i|
	next unless minimum_distance_matrix[i][src]

	#e = Edges[src][dst]
	current = minimum_distance_matrix[i][dst]
	next_cand = minimum_distance_matrix[i][src]+edge[0]
	if !current or current>next_cand then
	  minimum_distance_matrix[i][dst] = next_cand
	  #printf("minimum_distance_matrix[%d][%d] = %d\n", i, dst, next_cand)
	end
      end
    end
  end
end
<<END
N.times do |i|
  N.times do |j|
    current_distance = minimum_distance_matrix[i][j]
    next unless current_distance
    Edges[j].each_pair do |dest, e|
      dist, = e
      next_distance_candidate = current_distance + dist
      next_distance = minimum_distance_matrix[i][dest]
      if !next_distance or next_distance>next_distance_candidate then
	minimum_distance_matrix[i][dest] = next_distance_candidate
      end
    end 
  end
end
END
p minimum_distance_matrix

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 minimum_distance_matrix[src][dst] < e[0]
      count += 1
    end
  end
end

puts count



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

def merge_sorted_paths(a, b)
  return b if a.length==0
  return a if b.length==0

  # build a holder array that is the size of both input arrays
  # O(n) space
  result = []

  # get lower head value
  if a[0].distance < b[0].distance
    result << a.shift
  else
    result << b.shift
  end

  # check to see if either array is empty
  if a.length == 0
    return result + b
  elsif b.length ==0
    return result + b
  else
    return result + merge_sorted_paths(a, b)
  end
end

def find_a_path_less_than(src, dest, max)
  sorted_paths = [Path.new(0, [src])] # sorted_paths: [Path] sorted by Path.distance

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

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

    new_paths = []
    Edges[head.node_seq[-1]].each do |dest2, edge|
      distance, = *edge
      if head.distance + distance < max
        p = Path.new(head.distance + distance, head.node_seq+[dest2])
        new_paths.unshift(p)
      end
    end

    #sorted_paths.push(*new_paths)
    #sorted_paths.sort_by!(&:distance)
    new_paths.sort_by!(&:distance)
    sorted_paths = merge_sorted_paths(sorted_paths, new_paths)
  end

  return nil
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_less_than(src, dst, e[0])
      count += 1
    end
  end
end

puts count