#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
const int maxn=100;
int path[maxn];//路径上存放的结点编号
struct Node
{
int weight;
vector<int> child;
}node[maxn];
bool cmp(int a,int b)
{
return node[a].weight>node[b].weight;
}
int n,m,s;
void dfs(int index,int num,int sum)
{
if(sum>s) return;
if(sum==s)
{
if(node[index].child.size()!=0)
return;
else
{
for(int i=0;i<num;i++)
{
printf("%d",node[path[i]].weight);
if(i<(num-1))
printf(" ");
else printf("\n");
}
return;
}
}
for(int i=0;i<node[index].child.size();i++)
{
int child=node[index].child[i];
path[num]=child;
dfs(child,num+1,sum+node[child].weight);
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=0;i<n;i++)
{
scanf("%d",&node[i].weight);
}
int id,k,child;
for(int i=0;i<m;i++)
{
scanf("%d%d",&id,&k);
for(int j=0;j<k;j++)
{
scanf("%d",&child);
node[id].child.push_back(child);
}
sort(node[id].child.begin(),node[id].child.end(),cmp);
}
path[0]=0;
dfs(0,1,node[0].weight);
system("pause");
return 0;
}