from sys import stdin
from collections import defaultdict
# 计算从某个被标记的节点出发,不需要染色就能够到达的未被标记节点的数量
def dfs(node, parent): # (当前访问的节点, 当前节点的父节点)
visited[node] = 1
cnt = 0
for neighbor in tree[node]:
if not marked[neighbor]:
cnt += 1
elif neighbor != parent:
cnt += dfs(neighbor, node)
return cnt
while True:
try:
input = stdin.read
data = list(map(int, input().split()))
n = data[0]
k = data[1]
tree = defaultdict(list) # tree[i]表示节点i的相邻节点
marked = [0] * n # marked[i] 表示节点i是否被标记
MOD = 10 ** 9 + 7
cnt = []
for i in range(2, k + 2): # 读取被标记的节点
marked[data[i] - 1] = 1
for j in range(k + 2, 2 * n + k, 2): # 构建节点的邻接表
u = data[j] - 1
v = data[j + 1] - 1
tree[u].append(v)
tree[v].append(u)
visited = [0] * n # 记录节点是否被访问过
count = 0 # 记录需要额外染色的被标记节点的数量
ways = 1 # 满足条件的染色方案的数量
# 遍历所有标记的节点
for i in range(n):
if marked[i] and not visited[i]: # 避免重复
count += 1
# 每个未被访问的被标记节点需要额外染色一条边,所以count即为需要染色的边数
ways = (ways * dfs(i, -1)) % MOD
# 对于每个未被访问的被标记节点,它能到达多少个未被标记节点,就有多少种染色方案。
print(count, ways)
except:
break