#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N,M,S;
struct node{
int data;
vector<int> child;
};
vector<node> v;
vector<int> path;
void dfs(int index,int sum){
if(sum>S) return ;
if(sum==S){
if(v[index].child.size()!=0) return;
printf("%d",v[0].data);
for(int i=0;i<path.size();i++)
printf(" %d",v[path[i]].data);
printf("\n");
return;
}
for(int i=0;i<v[index].child.size();i++){
int next=v[index].child[i];
path.push_back(next);
dfs(next,sum+v[next].data);
path.pop_back();
}
}
bool cmp(int a,int b){//传入的是编号
return v[a].data>v[b].data;
}
int main(){
int K,id;
scanf("%d%d%d",&N,&M,&S);
v.resize(N);
for(int i=0;i<N;i++)
scanf("%d",&v[i].data);
for(int i=0;i<M;i++){
scanf("%d%d",&id,&K);
v[id].child.resize(K);
for(int j=0;j<K;j++)
scanf("%d",&v[id].child[j]);
sort(v[id].child.begin(),v[id].child.end(),cmp);
}
//path.push_back(0);
dfs(0,v[0].data);
return 0;
}