#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
struct Node{
int w;
vector<int> son;
}node[110];
int N, M, S;
int path[110];
bool cmp(int x, int y){
return node[x].w > node[y].w;
}
void dfs(int index, int deep, int sumw){
if(sumw > S) return;
if(sumw == S){
if(node[index].son.size() != 0) return;
printf("%d", path[0]);
for(int i = 1; i < deep; i++){
printf(" %d", path[i]);
}putchar('\n');
return;
}
for(int i = 0; i < node[index].son.size(); i++){
int temp = node[index].son[i];
path[deep] = node[temp].w;
dfs(temp, deep+1, sumw+node[temp].w);
}
}
int main(){
scanf("%d %d %d", &N, &M, &S);
for(int i = 0; i < N; i++){
scanf("%d", &node[i].w);
}
int no, k, x;
for(int i = 0; i < M; i++){
scanf("%d %d", &no, &k);
for(int j = 0; j < k; j++){
scanf("%d", &x);
node[no].son.push_back(x);
}
sort(node[no].son.begin(), node[no].son.end(), cmp);
}
path[0] = node[0].w;
dfs(0, 1, node[0].w);
return 0;
}