枚举每个低点,最多和多少个高点,取最大值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int h[50],a[50],map1[50][50];
int dp[2][(1<<15)+10];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
scanf("%d",&t);
int n,m,k,x,y;
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
memset(map1,0,sizeof(map1));
memset(dp,0,sizeof(dp));
memset(h,0,sizeof(h));
for(int i=1; i<=m; i++)
{scanf("%d%d",&x,&y),map1[x][y]=1;
map1[y][x]=1;}
for(int i=0; i<k; i++)
scanf("%d",&a[i]),h[a[i]]=1;
int now=0;
for(int i=1; i<=n; i++)
{
if(h[i])continue;
now=now^1;
for(int j=0; j<(1<<k); j++)dp[now][j]=dp[now^1][j];
for(int j=0; j<(1<<k); j++)
{
for(int k1=0; k1<k; k1++)
{
if(!(j&(1<<k1))&&map1[i][a[k1]])
{
for(int k2=k1+1; k2<k; k2++)
{
if(!(j&(1<<k2))&&map1[i][a[k2]])
{
int state=(j)|(1<<k1)|(1<<k2);
dp[now][state]=max(dp[now][state],dp[now^1][j]+1);
}
}
}
}
}
}
int ans=0;
for(int i=0; i<(1<<k); i++) ans=max(ans,dp[now][i]);
printf("%d\n",ans);
}
return 0;
}