1 /************************************************
2 Author :Running_Time
3 Created Time :2015-8-5 9:03:34
4 File Name :UVA_1424.cpp
5 ************************************************/
6
7 #include <cstdio>
8 #include <algorithm>
9 #include <iostream>
10 #include <sstream>
11 #include <cstring>
12 #include <cmath>
13 #include <string>
14 #include <vector>
15 #include <queue>
16 #include <deque>
17 #include <stack>
18 #include <list>
19 #include <map>
20 #include <set>
21 #include <bitset>
22 #include <cstdlib>
23 #include <ctime>
24 using namespace std;
25
26 #define lson l, mid, rt << 1
27 #define rson mid + 1, r, rt << 1 | 1
28 typedef long long ll;
29 const int MAXN = 1e2 + 10;
30 const int INF = 0x3f3f3f3f;
31 const int MOD = 1e9 + 7;
32 bool con[MAXN][MAXN];
33 vector<int> G[MAXN];
34 vector<int> pre;
35 int a[MAXN*2];
36 int dp[MAXN][2][MAXN];
37 int n1, m, n;
38
39 int work(void) {
40 memset (dp, INF, sizeof (dp)); pre.clear ();
41 dp[1][0][a[1]] = 0;
42 for (int i=1; i<=n1; ++i) {
43 if (i == a[1]) continue;
44 pre.push_back (i);
45 dp[1][1][i] = 1;
46 }
47 for (int i=2; i<=n; ++i) {
48 if (con[a[i-1]][a[i]]) {
49 dp[i][0][a[i]] = dp[i-1][0][a[i-1]];
50 pre.clear (); continue;
51 }
52 vector<int> tmp;
53 for (int j=0; j<pre.size (); ++j) {
54 int u = pre[j];
55 for (int k=0; k<G[u].size (); ++k) {
56 int v = G[u][k];
57 if (con[u][v]) {
58 if (v == a[i]) dp[i][0][v] = min (dp[i][0][v], dp[i-1][1][u]);
59 else dp[i][1][v] = min (dp[i][1][v], dp[i-1][1][u] + 1);
60 tmp.push_back (v);
61 }
62 }
63 }
64 pre.clear ();
65 for (int j=0; j<tmp.size (); ++j) pre.push_back (tmp[j]);
66 }
67
68 int res = INF;
69 res = min (res, dp[n][0][a[n]]);
70 for (int i=0; i<pre.size (); ++i) {
71 int v = pre[i];
72 res = min (res, dp[n][1][v]);
73 }
74
75 //debug
76 for (int i=1; i<=n; ++i) {
77 printf ("%d ", dp[i][0][a[i]]);
78 }
79 puts ("");
80
81 return res;
82 }
83
84 int main(void) {
85 int T; scanf ("%d", &T);
86 while (T--) {
87 scanf ("%d%d", &n1, &m);
88 memset (con, false, sizeof (con));
89 for (int i=1; i<=n1; ++i) G[i].clear ();
90 for (int i=1; i<=n1; ++i) con[i][i] = true;
91 for (int i=1; i<=m; ++i) {
92 int u, v; scanf ("%d%d", &u, &v);
93 con[u][v] = con[v][u] = true; G[u].push_back (v); G[v].push_back (u);
94 }
95 scanf ("%d", &n);
96 for (int i=1; i<=n; ++i) {
97 scanf ("%d", &a[i]);
98 }
99
100 printf ("%d
", work ());
101 }
102
103 return 0;
104 }