7 3
1 4 7
1 2 2
2 3 3
3 4 8
2 5 1
1 6 4
6 7 5
 10 2
1 5
5 3 2
8 4 8
7 6 9
7 10 1
10 1 4
9 5 1
5 8 2
7 2 9
6 5 6
 10 5
4 8 7 5 1
5 1 1
2 7 1
4 3 1
10 9 1
10 1 1
1 8 1
10 7 1
10 3 1
7 6 1
 10 9
9 7 6 10 3 5 2 8 1
9 4 10
10 8 3
3 6 2
5 1 8
5 2 5
1 10 10
6 7 1
9 1 7
1 6 3
 10 5
8 5 2 10 1
3 1 7
5 4 6
10 8 4
6 8 9
7 8 4
9 5 6
8 1 9
2 10 2
9 8 7

3 2
 2 3
 5 1
 0 1
 5 1

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=100010;
const int INF=maxn*10;
const int Step=17;
int n,m;
bool black[maxn];
int first[maxn],next[maxn<<1],v[maxn<<1],w[maxn<<1],edge=0;
int down[maxn][2],d_bh[maxn][2],split[maxn][2];
int to[maxn];
int dp[maxn][Step+2],dep[maxn];
int add[maxn],ans[maxn];

void add_edge(int a,int b,int c){
	next[edge]=first[a];
	v[edge]=b;
	w[edge]=c;
	first[a]=edge++;
}

void dfs1(int x,int fa){// 返回最长链们的LCA
	down[x][0]=down[x][1]=-INF;if(black[x]) down[x][0]=0,split[x][0]=x;
	for(int e=first[x];e!=-1;e=next[e]){
		if(v[e]==fa) continue;
		dfs1(v[e],x);
		int t=w[e]+down[v[e]][0];
		if(t>=down[x][0]) {
			if(t==down[x][0]) split[x][0]=x;else split[x][0]=split[v[e]][0];
			down[x][1]=down[x][0],d_bh[x][1]=d_bh[x][0],down[x][0]=t,d_bh[x][0]=v[e];split[x][1]=split[x][0];
		}
		else if(t>down[x][1]) down[x][1]=t,d_bh[x][1]=v[e],split[x][1]=split[v[e]][0];
		else if(t==down[x][1]) split[x][1]=x;
	}
	//printf("x:%d down0:%d down1:%d split0:%d split1:%d\n",x,down[x][0],down[x][1],split[x][0],split[x][1]);
}

void dfs2(int x,int fa,int up,int us){
	//printf("x:%d up:%d us:%d\n",x,up,us);
	dp[x][0]=fa;dep[x]=dep[fa]+1;
	if(black[x]){
		if(down[x][0]==up) to[x]=x;
		else if(down[x][0]<up) to[x]=us;
		else to[x]=split[x][0];
	}
	for(int e=first[x];e!=-1;e=next[e]){
		if(v[e]==fa) continue;
		int len=up,p=us;
		if(v[e]==d_bh[x][0]){if(down[x][1]>len) len=down[x][1],p=split[x][1];else if(down[x][1]==len) p=x;}
		else{
			if(down[x][0]>len) len=down[x][0],p=split[x][0];else if(down[x][0]==len) p=x;
		}
		dfs2(v[e],x,len+w[e],p);
	}
}

int LCA(int a,int b){
	if(dep[a]<dep[b]) swap(a,b);
	int t=dep[a]-dep[b];
	for(int j=Step;j>=0;j--) if(t&(1<<j)) a=dp[a][j];
	int j=Step;
	while(a!=b){
		while(j&&dp[a][j]==dp[b][j]) j--;
		a=dp[a][j];b=dp[b][j];
	}
	return a;
}

int dfs(int x,int fa){
	int num=0;
	for(int e=first[x];e!=-1;e=next[e])
		if(v[e]!=fa) num+=dfs(v[e],x);
	num+=add[x];
	return ans[x]=num;
}

int main(){
	int x,a,b,c;
	scanf("%d%d",&n,&m);
	memset(first,-1,sizeof(first));
	for(int i=1;i<=m;i++) scanf("%d",&x),black[x]=1;
	for(int i=1;i<n;i++) scanf("%d%d%d",&a,&b,&c),add_edge(a,b,c),add_edge(b,a,c);
	dfs1(1,-1);
	dep[0]=0;dfs2(1,0,0,1);
	for(int j=1;j<=Step;j++)
		for(int i=1;i<=n;i++)
			dp[i][j]=dp[dp[i][j-1]][j-1];
	for(int i=1;i<=n;i++)
		if(black[i]){
				//printf("to[%d]:%d\n",i,to[i]);
			add[i]++;add[to[i]]++;int t=LCA(i,to[i]);add[t]--;add[dp[t][0]]--;
		//	printf("to[%d]:%d\n",i,to[i]);
		}
	dfs(1,0);
	int big=0,res;
	for(int i=1;i<=n;i++) 
		if(!black[i]) {if(ans[i]>big) big=ans[i],res=1;else if(ans[i]==big) res++;}
	printf("%d %d\n",big,res);
	return 0;
}
