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