#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<queue>
#include<cmath>
#include<stack>
using namespace std;
const int maxn = 200;
int n,m,s;
struct node
{
int weight;
vector<int>child;
};
node nd[maxn];
int path[maxn];
bool cmp(int a,int b)
{
return nd[a].weight>nd[b].weight;
}
void dfs(int index, int numnode,int sum)
{
if(sum>s)return;
if(sum==s)
{
if(nd[index].child.size()!=0) return;
printf("%d",nd[path[0]].weight);
for(int i=1;i<numnode;i++)
{
printf(" %d",nd[path[i]].weight);
}
printf("\n");
return;
}
for(int i=0;i<nd[index].child.size();i++)
{
int id = nd[index].child[i];
path[numnode]=id;
dfs(id,numnode+1,sum+nd[id].weight);
}
}
int main()
{
cin>>n>>m>>s;
for(int i=0;i<n;i++)
{
cin>>nd[i].weight;
}
for(int i=0;i<m;i++)
{
int x,num;
cin>>x>>num;
for(int j=0;j<num;j++)
{
int y;
cin>>y;
//这里问题,0相当于00在int里吗
nd[x].child.push_back(y);
}
sort(nd[x].child.begin(),nd[x].child.end(),cmp);
}
path[0]=0;
dfs(0,1,nd[0].weight);
return 0;
}