#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int s, w[110], vis[110];
vector<int> v[110], path;
void printpath()
{
int size = path.size(), i;
for(i = 0; i < size; i++)
{
if(i > 0)
{
printf(" ");
}
printf("%d", w[path[i]]);
}
printf("\n");
}
void dfs(int cur, int curw)
{
int size = v[cur].size();
if(size == 0 && curw == s)
{
printpath();
return;
}
int i, next, nextw;
for(i = 0; i < size; i++)
{
next = v[cur][i];
nextw = curw + w[next];
if(vis[next] == 0 && nextw <= s)
{
vis[next] = 1;
path.push_back(next);
dfs(next, nextw);
vis[next] = 0;
path.pop_back();
}
}
}
int cmp(int a, int b)
{
return w[a] > w[b];
}
int main()
{
int n, m;
scanf("%d%d%d", &n, &m, &s);
int i;
for(i = 0; i < n; i++)
{
scanf("%d", &w[i]);
}
int root, k, next, j;
for(i = 1; i <= m; i++)
{
scanf("%d%d", &root, &k);
for(j = 1; j <= k; j++)
{
scanf("%d", &next);
v[root].push_back(next);
}
sort(v[root].begin(), v[root].end(), cmp);
}
vis[0] = 1;
path.push_back(0);
dfs(0, w[0]);
system("pause");
return 0;
}