import heapq def main(): import sys input = sys.stdin.read data = input().split() idx = 0 n = int(data[idx]) idx +=1 m = int(data[idx]) idx +=1 K = int(data[idx]) idx +=1 X = int(data[idx])-1 idx +=1 Y = int(data[idx])-1 idx +=1 poles = [] for _ in range(n): x = int(data[idx]) y = int(data[idx+1]) poles.append( (x, y) ) idx +=2 edges = [[] for _ in range(n)] for _ in range(m): u = int(data[idx])-1 idx +=1 v = int(data[idx])-1 idx +=1 dx = poles[u][0] - poles[v][0] dy = poles[u][1] - poles[v][1] dist = (dx**2 + dy**2)**0.5 edges[u].append( (v, dist) ) edges[v].append( (u, dist) ) heap = [] initial_visited = frozenset([X]) heapq.heappush(heap, (0.0, X, initial_visited)) best = {} key = (X, initial_visited) best[key] = 0.0 results = [] while heap and len(results) < K: dist, u, visited = heapq.heappop(heap) if u == Y: results.append(dist) if len(results) == K: break continue if (u, visited) in best and best[(u, visited)] < dist: continue for v, w in edges[u]: if v not in visited: new_visited = frozenset(visited | {v}) new_dist = dist + w key = (v, new_visited) if key not in best or new_dist < best.get(key, float('inf')): best[key] = new_dist heapq.heappush(heap, (new_dist, v, new_visited)) for res in results[:K]: print("{0:.6f}".format(res)) for _ in range(K - len(results)): print(-1) if __name__ == '__main__': main()