#include <iostream>
#include <vector>
using namespace std;
int main() {
//
int n,k;
cin >> n >> k;
// denote the red nodes among the n nodes
vector<bool> red_nodes_tag(n+1,false);
vector<int> red_nodes;
for(int i=0;i<k;i++){
int v;
cin >> v;
red_nodes.push_back(v);
red_nodes_tag[v]=true;
}
// get the tree by adjacent matrix
vector<vector<int>> tree(n+1);
int u,v;
while(cin >> u >> v){
tree[u].push_back(v);
tree[v].push_back(u);
}
// use dfs to populate to get connected part, by the way cnt the num of not red neighbor
vector<int> already_dfs(n+1,0);
vector<int> visited_as_root(n+1,0);
auto dfs = [&already_dfs,&visited_as_root,&red_nodes_tag,&tree](auto self, int root)->int{
already_dfs[root] = 1;
if(visited_as_root[root] && red_nodes_tag[root]) return 0;
if(!red_nodes_tag[root]) return 1; // impossible case
long long neighbor_cnt = 0;
for(auto v: tree[root]){
if(!already_dfs[v] && red_nodes_tag[v]){
neighbor_cnt += self(self, v);
// cout << "v" << v << ';' << neighbor_cnt << endl;
}
else if(!red_nodes_tag[v]){
// visited_as_leaf[v] = 1;
neighbor_cnt += 1;
}
}
visited_as_root[root] = 1;
return neighbor_cnt;
};
int part_cnt = 0;
long long num_methods = 1;
long long base = 1e9+7;
for(auto v: red_nodes){
if(!visited_as_root[v]){
part_cnt += 1;
long long neighbor_cnt=0;
neighbor_cnt = dfs(dfs, v);
// cout << "dfs" << ' ' << v << "neighbor_cnt" << neighbor_cnt << endl;
num_methods = ((num_methods % base) * (neighbor_cnt % base)) % base;
// cout << neighbor_cnt << ' ' << num_methods << endl;
}
}
// output1: num of 联通树
cout << part_cnt << ' ' << num_methods;
// output2: 每个联通树连接的非染色边的乘积
}
// 64 位输出请用 printf("%lld")