import numpy as np

assert(False)

nodes = []
class Node:
	counter = 0

	def __init__(self):
		self.nr = Node.counter
		self.ok = False
		Node.counter += 1
		self.ch = {}
		self.next = {}
		nodes.append(self)
	
	def insert(self, text):
		if text == '':
			self.ok = True
		else:
			l = text[0]
			if l not in self.ch:
				self.ch[l] = Node()
			self.ch[l].insert(text[1:])
	
	def lookup(self, text, ind):
		if ind == len(text):
			return self
		l = text[ind]
		if l not in self.ch:
			return None
		return self.ch[l].lookup(text, ind + 1)
	
	def find_back(self, text, lookup):
		for i in 'HT':
			t = text + i
			for j in range(len(t) + 1):
				l = lookup(t[j:])
				if l is not None:
					self.next[i] = l
					break
		for k, v in self.ch.items():
			v.find_back(text + k, lookup)
			
w, b = map(int, input().split())
root = Node()

for _ in range(w):
	s = input()
	root.insert(s)
	
root.find_back('', lambda t: root.lookup(t, 0))

n = Node.counter
M = np.zeros((n, n), dtype='float64')
b = np.zeros((n,), dtype='float64')
for u in nodes:
	if not u.ok:
		for v in u.next.values():
			M[u.nr, v.nr] += 0.5
		b[u.nr] = -1
		M[u.nr, u.nr] -= 1
	else:
		M[u.nr, u.nr] = 1
assert(np.linalg.matrix_rank(M) == n)
x = np.linalg.solve(M, b)
print("%.10f" % x[0])
