//1053. Path of Equal Weight (30)
//简单的dfs
//accept
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool road[105][105] = {false};
bool leaf[105] = {false};
int n, m, s;
int wei[105];
int currwei = 0;
vector<vector<int>> result;
vector<int> currresult;
bool cmp(vector<int> s1, vector<int> s2)
{
int i;
for (i = 0;i<s1.size() && i< s2.size();i++)
{
if (s1[i] == s2[i])
{
continue;
}
else
return s1[i] > s2[i];
}
return false;
}
void dfs(int curr)
{
if(leaf[curr] == false)
{
if (currwei == s)
{
result.push_back(currresult);
}
return;
}
int i;
for (i = 0;i<n;i++)
{
if (i != curr && road[curr][i] == true)
{
currwei += wei[i];
currresult.push_back(wei[i]);
dfs(i);
currwei -= wei[i];
currresult.pop_back();
}
}
}
int main()
{
cin >> n >> m >> s;
int i;
for (i=0;i<n;i++)
{
scanf("%d", &wei[i]);
}
int start;
int num;
int j;
int end;
for (i = 0;i<m;i++)
{
cin >> start;
leaf[start] = true;
cin >> num;
for (j = 0;j<num;j++)
{
cin >> end;
road[start][end] = true;
}
}
s = s - wei[0];
dfs(0);
sort(result.begin(), result.end(), cmp);
for (i = 0;i<result.size();i++)
{
cout << wei[0];
for (j = 0;j<result[i].size();j++)
{
cout << " " << result[i][j];
}
cout << endl;
}
return 0;
}