#include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;



struct Info{
	int result,element_num;
	vector<int> element;
};

int N,E,T;
int POW[11],use_num[1024];
int in_num[1000],relation[1000][300];
int min_need[300];
int dp[1024];
vector<int> G[1000];
Info info[1000];

int main(){

	for(int i = 0; i < 11; i++)POW[i] = pow(2,i);

	//状態毎にいくつbitが立っているか、事前に計算しておく
	int num_1;
	for(int state = 0; state < POW[10]; state++){
		num_1 = 0;
		for(int loop = 0; loop < 10; loop++){
			if(state & (1 << loop)){
				num_1++;
			}
		}
		use_num[state] = num_1;
	}

	scanf("%d %d %d",&N,&E,&T);

	for(int i = 0;i < E; i++){
		in_num[i] = 0;
		for(int k = 0; k < N; k++)relation[i][k] = 0;
	}

	for(int i = 0; i < N; i++)min_need[i] = BIG_NUM;

	int tmp;
	for(int i = 0; i < N; i++){
		scanf("%d",&tmp);
		if(tmp == 1){//手に入れやすい卵
			min_need[i] = 1;
		}
	}

	//合成法則の情報を取得
	for(int loop = 0; loop < E; loop++){
		scanf("%d %d",&info[loop].result,&info[loop].element_num);

		info[loop].result--; //0オリジンにする

		for(int i = 0; i < info[loop].element_num; i++){ //要素を取得するとともに、未確定情報の個数を計上する(トポロジカル的に考える)
			scanf("%d",&tmp);
			tmp--;
			info[loop].element.push_back(tmp);
			if(min_need[tmp] == BIG_NUM){ //手に入れにくい魔女
				G[tmp].push_back(loop); //依存関係をエッジ化する
				in_num[loop]++;
				relation[loop][tmp] = 1; //★★ある魔女について、複数の合成情報があるため、単純なin_numの引き算ではバグる★★
			}
		}
	}

	//確定できる合成情報のindexをpush
	queue<int> Q;
	for(int i = 0; i < E; i++){
		if(in_num[i] == 0){
			Q.push(i);
		}
	}

	int index,tmp_num,next_state,can_recycle_num;
	bool update_FLG;
	while(!Q.empty()){
		index = Q.front();
		Q.pop();

		//必要な卵の個数をdp計算する(★★作成順の都合により、単純な引き算では不可★★)
		tmp_num = info[index].element_num;
		for(int state = 0; state < POW[tmp_num]; state++)dp[state] = BIG_NUM;

		dp[0] = 0;
		for(int state = 0; state < POW[tmp_num]-1; state++){
			for(int loop = 0; loop < tmp_num; loop++){
				if(state & (1 << loop)){
					//Do nothing
				}else{
					next_state = state+POW[loop];
					can_recycle_num = dp[state]-use_num[state]; //最小個数-使用個数 = リサイクル可能数
					dp[next_state] = min(dp[next_state],dp[state]+max(0,min_need[info[index].element[loop]]-can_recycle_num));
				}
			}
		}

		update_FLG = false;
		if(min_need[info[index].result] > dp[POW[tmp_num]-1]){
			min_need[info[index].result] = dp[POW[tmp_num]-1];
			update_FLG = true;
		}
		min_need[info[index].result] = min(min_need[info[index].result],dp[POW[tmp_num]-1]);

		for(int i = 0; i < G[info[index].result].size(); i++){ //依存関係のある情報を検索

			if(relation[G[info[index].result][i]][info[index].result] == 1){

				relation[G[info[index].result][i]][info[index].result] = 0;
				in_num[G[info[index].result][i]]--; //未確定情報の数を1つ減らす
				if(in_num[G[info[index].result][i]] == 0){ //未確定情報が無くなった場合
					Q.push(G[info[index].result][i]);
				}
			}else{ //relatino[G[info[index].result][i]][info[index].result] == 0 //既出の情報の場合

				if(!update_FLG)continue;

				if(in_num[G[info[index].result][i]] == 0){ //未確定情報が無い場合、最小値が更新される可能性があるのでpush
					Q.push(G[info[index].result][i]);
				}
			}
		}
	}

	T--;
	if(min_need[T] == BIG_NUM){
		printf("-1\n");
	}else{
		printf("%d\n",min_need[T]);
	}

	return 0;
}



Measured memory_bytes: 4724