// Arup Guha
// 3/11/2019
// Solution to 2019 UCF HS Problem: Charles and the Corgi Conundrum

import java.util.*;

public class corgi {

	public static int n;
	public static ArrayList[] graph;
	
	public static void main(String[] args) {
		
		Scanner stdin = new Scanner(System.in);
		int numCases = stdin.nextInt();
		
		// Process each case.
		for (int loop=1; loop<=numCases; loop++) {
			
			// Read data, form graph.
			n = stdin.nextInt();
			int numEdges = stdin.nextInt();
			graph = new ArrayList[n];
			for (int i=0; i<n; i++)
				graph[i] = new ArrayList<Integer>();
			for (int i=0; i<numEdges; i++) {
				int v1 = stdin.nextInt()-1;
				int v2 = stdin.nextInt()-1;
				graph[v1].add(v2);
				graph[v2].add(v1);
			}
			
			// Ta da!
			System.out.printf("Pond #%d: %.3f\n", loop, solve());
		}
	}
	
	public static double solve() {
		
		int sumsq = 0;
		boolean[] used = new boolean[n];
		
		// Find each component.
		for (int i=0; i<n; i++) {
			if (!used[i]) {
				int size = dfs(i, used);
				sumsq += (size*size);
			}
		}
		
		// Ta da!
		return 1.0*sumsq/n;
	}
	
	public static int dfs(int v, boolean[] used) {
		
		// Mark and count node.
		int cnt = 1;
		used[v] = true;
		
		// Recurse.
		for (Integer x: (ArrayList<Integer>)graph[v])
			if (!used[x])
				cnt += dfs(x, used);
			
		// Return sum.
		return cnt;
	}
}