#include #define REP(i, n) for (int i = 0; i < n; i++) #define llINF ((long long)1e18) #define iINF ((int)1e9) #define ALL(obj) obj.begin(), obj.end() using namespace std; template struct Edge { int rev, from, to; T cap, icap; Edge(int rev, int from, int to, T cap) : rev(rev), from(from), to(to), cap(cap), icap(cap) {} }; template struct Graph { vector>> list; Graph(int n = 0) : list(n) {} void init(int n = 0) { list.clear(); list.resize(n); } inline vector> &operator[](int i) { return list[i]; } inline const size_t size() const { return list.size(); } inline Edge &redge(Edge e) { if (e.from != e.to) return list[e.to][e.rev]; else return list[e.to][e.rev + 1]; } void addEdge(int from, int to, T cap) { list[from].push_back(Edge((int)list[to].size(), from, to, cap)); list[to].push_back(Edge((int)list[from].size() - 1, to, from, 0)); } }; template struct Dinic { const T INF = 1 << 30; vector level, iter; Dinic() {} void bfs(Graph &graph, int s) { level.assign((int)graph.size(), -1); level[s] = 0; queue que; que.push(s); while (!que.empty()) { int v = que.front(); que.pop(); for (int i = 0; i < graph[v].size(); i++) { Edge &e = graph[v][i]; if (level[e.to] < 0 && e.cap > 0) { level[e.to] = level[v] + 1; que.push(e.to); } } } } T dfs(Graph &graph, int v, int t, T f) { if (v == t) return f; for (int &i = iter[v]; i < graph[v].size(); i++) { Edge &e = graph[v][i], &re = graph.redge(e); if (level[v] < level[e.to] && e.cap > 0) { T d = dfs(graph, e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; re.cap += d; return d; } } } return 0; } T solve(Graph &graph, int s, int t) { level.assign((int)graph.size(), -1); iter.assign((int)graph.size(), 0); T res = 0; for (;;) { bfs(graph, s); if (level[t] < 0) return res; for (int i = 0; i < (int)iter.size(); i++) iter[i] = 0; T flow = 0; while ((flow = dfs(graph, s, t, INF)) > 0) { res += flow; } } } }; int main() { int W, N, M; cin >> W >> N; vector J(N); REP(i, N) { cin >> J[i]; } cin >> M; vector C(M); REP(i, M) { cin >> C[i]; } Graph graph(110); REP(i, M) { int Q; cin >> Q; vector connect(N, true); REP(j, Q) { int X; cin >> X; connect[X - 1] = false; } REP(j, N) { if (!connect[j]) continue; graph.addEdge(j, N + i, J[j]); } } REP(i, N) { graph.addEdge(N + M, i, 10000); } REP(i, M) { graph.addEdge(N + i, N + M + 1, C[i]); } Dinic dinic; int s = N + M, t = M + N + 1; int ans = dinic.solve(graph, s, t); cout << (ans >= W ? "SHIROBAKO" : "BANSAKUTSUKITA") << endl; }