// freopen("input.txt", "r", stdin);
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <utility>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <cstring>
#include <list>
#include <set>
#include <string.h>
#include <map>
#include <limits.h>
#include <stdlib.h>
#include <typeinfo>
#include <bitset>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define range(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define pb push_back
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int INF = 987654321;
int c[802][802];
int f[802][802];
int d[802];
int S = 0;
int F = 800;
vector<int> arr[802];
int N, K, D;
int a, b;
int cap;
int maxFlow(int source, int sink)
{
int ans = 0;
while (1)
{
fill(d, d+802, -1);
queue<int> q;
q.push(source);
while (!q.empty())
{
int cur = q.front();
q.pop();
for (int i = 0; i < arr[cur].size(); i++)
{
int next = arr[cur][i];
if (c[cur][next] - f[cur][next] > 0 && d[next] == -1)
{
d[next] = cur;
q.push(next);
}
}
}
if (d[sink] == -1)
break;
int flow = INF;
for (int i = sink; i != source; i = d[i])
{
flow = min(flow, c[d[i]][i] - f[d[i]][i]);
}
for (int i = sink; i != source; i = d[i])
{
f[d[i]][i] += flow;
f[i][d[i]] -= flow;
}
ans += flow;
}
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> K >> D;
for (int i = 1; i <= D; i++)
{
cin >> a;
arr[F].push_back(i + 400);
arr[i+400].push_back(F);
c[i+400][F] = a;
}
for (int i = 1; i <= N; i++)
{
cin >> a;
c[S][i] = K;
arr[S].push_back(i);
arr[i].push_back(S);
for(int j = 1; j <= a; j++)
{
cin >> b;
c[i][400 + b] = 1;
arr[i].push_back(400 + b);
arr[400 + b].push_back(i);
}
}
cout << maxFlow(S, F);
return 0;
}