#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int target;
struct Node {
int w;
vector<int> child;
};
vector<Node> v;
vector<int> path;
void dfs(int index,int nodeNum,int sum){
if(sum>target) return;
if(sum==target){
if(v[index].child.size()!=0) return;
for(int i=0;i<nodeNum;i++){
printf("%d%c",v[path[i]].w,i!=nodeNum-1?' ':'\n');
}
return;
}
for(int i=0;i<v[index].child.size();i++){
int node=v[index].child[i];
path[nodeNum]=node;
dfs(node,nodeNum+1,sum+v[node].w);
}
}
int cmp(int a,int b){
return v[a].w>v[b].w;
}
int main(){
int n,m,node,k;
cin>>n>>m>>target;
v.resize(n);
path.resize(n);
for(int i=0;i<n;i++){
scanf("%d",&v[i].w);
}
for(int i=0;i<m;i++){
scanf("%d %d",&node,&k);
v[node].child.resize(k);
for(int j=0;j<k;j++){
scanf("%d",&v[node].child[j]);
}
sort(v[node].child.begin(),v[node].child.end(),cmp);
}
dfs(0,1,v[0].w);
system("pause");
return 0;
}