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<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<queue>
#define X first
#define Y second
#define pb push_back
#define fr(i,n) for(int i=1;i<=n;i++)
#define fo(i,n) for(int i=0;i<n;i++)

using namespace std;

typedef long long ll;

const int INF=0x3f3f3f3f;
const int mod=(int)1e9+7;
const int N=100010;

int n,m,v[N];
int head[N],next[N<<1],key[N<<1],len[N<<1],cnt;
int sdis[N],slca[N],fdis[N],flca[N];
int f[N][20],dep[N],w[N];

void add(int x,int y,int z){
	next[++cnt]=head[x];
	key[cnt]=y;
	len[cnt]=z;
	head[x]=cnt;
}

void sdfs(int x,int fa){
	sdis[x]=-INF;
	slca[x]=x;
	if(v[x]) sdis[x]=0;
	for(int i=head[x];~i;i=next[i]){
		if(key[i]==fa) continue;
		f[key[i]][0]=x;
		dep[key[i]]=dep[x]+1;
		sdfs(key[i],x);
		if(sdis[key[i]]+len[i]>sdis[x]){
			sdis[x]=sdis[key[i]]+len[i];
			slca[x]=slca[key[i]];
		}
		else if(sdis[key[i]]+len[i]==sdis[x]){
			slca[x]=x;
		}
	}
}

int getlca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=19;i>=0;i--)
		if(dep[f[x][i]]>=dep[y])
			x=f[x][i];
	if(x==y) return x;
	for(int i=19;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}

void add(int x,int y){
	int lca=getlca(x,y);
	w[f[lca][0]]-=1;
	w[lca]-=1;
	w[x]+=1;
	w[y]+=1;
}

typedef pair<int,int>pi;

void fdfs(int x,int fa){
	if(v[x]){
		if(fdis[x]>sdis[x]){
			add(x,flca[x]);
		}
		if(sdis[x]>fdis[x]){
			add(x,slca[x]);
		}
	}
	vector<pi>son;
	for(int i=head[x];~i;i=next[i]){
		if(key[i]==fa) continue;
		son.pb(pi(key[i],len[i]));
	}
	int maxdis=0,lca=0;
	for(int i=0;i<son.size();i++){
		pi a=son[i];
		if(maxdis+a.Y>fdis[a.X]){
			fdis[a.X]=maxdis+a.Y;
			flca[a.X]=lca;
		}
		else if(maxdis+a.Y==fdis[a.X]){
			flca[a.X]=x;
		}
		if(sdis[a.X]+a.Y>maxdis){
			maxdis=sdis[a.X]+a.Y;
			lca=slca[a.X];
		}	
		else if(sdis[a.X]+a.Y==maxdis){
			lca=x;
		}
	}
	maxdis=0,lca=0;
	for(int i=son.size()-1;i>=0;i--){
		pi a=son[i];
		if(maxdis+a.Y>fdis[a.X]){
			fdis[a.X]=maxdis+a.Y;
			flca[a.X]=lca;
		}
		else if(maxdis+a.Y==fdis[a.X]){
			flca[a.X]=x;
		}
		if(sdis[a.X]+a.Y>maxdis){
			maxdis=sdis[a.X]+a.Y;
			lca=slca[a.X];
		}	
		else if(sdis[a.X]+a.Y==maxdis){
			lca=x;
		}
	}
	for(int i=head[x];~i;i=next[i]){
		if(key[i]==fa) continue;
		if(fdis[x]+len[i]>fdis[key[i]]){
			fdis[key[i]]=fdis[x]+len[i];
			flca[key[i]]=flca[x];
		}
		else if(fdis[x]+len[i]==fdis[key[i]]){
			flca[key[i]]=x;
		}
		fdfs(key[i],x);
	}
}

int ans,res;

int getans(int x,int fa){
	int tot=w[x];
	for(int i=head[x];~i;i=next[i])
		if(key[i]!=fa)
			tot+=getans(key[i],x);
	if(!v[x]){
		if(tot>ans){
			ans=tot;
			res=1;
		}
		else if(tot==ans){
			res++;
		}
	}
	return tot;
}

int main(){
	memset(head,-1,sizeof head);
	scanf("%d%d",&n,&m);
	for(int i=1,x;i<=m;i++)
		scanf("%d",&x),v[x]=1;
	for(int i=1,x,y,z;i<n;i++){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z),add(y,x,z);
	}
	dep[1]=1;
	sdfs(1,0);
	for(int i=1;i<20;i++)
		for(int j=1;j<=n;j++)
			f[j][i]=f[f[j][i-1]][i-1];
	fdfs(1,0);
	ans=-1;
	getans(1,0);
	cout<<ans<<' '<<res<<endl;
	return 0;
}
