import re
def dfs(g, v, visited, p):
visited[v] = True
for w in g[v]:
if not visited[w]: dfs(g, w, visited, p)
# p.insert(0, v)
if not p:
p.append([v])
else:
for w in p[0]:
if w in g[v]:
p.insert(0, [v])
return
p[0].append(v)
def topological(g):
visited = [False for i in range(len(g))]
p = []
for v in range(len(g)):
if not visited[v]: dfs(g, v, visited, p)
return p
def add_edges(g, f, t, vertices):
if '*' not in f and '*' not in t:
g[vertices[f]].append(vertices[t])
elif '*' not in f:
f = vertices[f]
t = re.sub('\*', '', t)
for name in vertices:
if t in name: g[f].append(vertices[name])
elif '*' not in t:
f = re.sub('\*', '', f)
t = vertices[t]
for name in vertices:
if f in name: g[vertices[name]].append(t)
else:
ff = re.sub('\*', '', f)
tt = re.sub('\*', '', t)
for name in vertices:
if ff in name: add_edges(g, name, t, vertices)
if tt in name: add_edges(g, f, name, vertices)
if __name__ == '__main__':
warning = "Warning: '%s' does not have any ordering."
N, M = [int(token) for token in raw_input().split()]
vertices = {}
vertex_names = []
for i in range(N):
vertex_names.append(raw_input())
vertices[vertex_names[-1]] = i
g = {v:[] for v in vertices.values()}
for i in range(M):
f, t = raw_input().split()
add_edges(g, f, t, vertices)
has_order = [False for i in range(N)]
for v in g:
for w in g[v]: has_order[w] = True
if g[v]: has_order[v] = True
od = 1
for p in topological(g):
print str(od)+'. '+', '.join(vertex_names[i] for i in p if has_order[i])
od += 1
if not all(has_order):
for i in range(N):
if not has_order[i]: print warning % (vertex_names[i])
aW1wb3J0IHJlCgpkZWYgZGZzKGcsIHYsIHZpc2l0ZWQsIHApOgogICAgdmlzaXRlZFt2XSA9IFRydWUKICAgIGZvciB3IGluIGdbdl06CiAgICAgICAgaWYgbm90IHZpc2l0ZWRbd106IGRmcyhnLCB3LCB2aXNpdGVkLCBwKQogICAgIyBwLmluc2VydCgwLCB2KQogICAgaWYgbm90IHA6CiAgICAgICAgcC5hcHBlbmQoW3ZdKQogICAgZWxzZToKICAgICAgICBmb3IgdyBpbiBwWzBdOgogICAgICAgICAgICBpZiB3IGluIGdbdl06CiAgICAgICAgICAgICAgICBwLmluc2VydCgwLCBbdl0pCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBwWzBdLmFwcGVuZCh2KQogICAgCmRlZiB0b3BvbG9naWNhbChnKToKICAgIHZpc2l0ZWQgPSBbRmFsc2UgZm9yIGkgaW4gcmFuZ2UobGVuKGcpKV0KICAgIHAgPSBbXQogICAgZm9yIHYgaW4gcmFuZ2UobGVuKGcpKToKICAgICAgICBpZiBub3QgdmlzaXRlZFt2XTogZGZzKGcsIHYsIHZpc2l0ZWQsIHApCiAgICByZXR1cm4gcAoKZGVmIGFkZF9lZGdlcyhnLCBmLCB0LCB2ZXJ0aWNlcyk6CiAgICBpZiAnKicgbm90IGluIGYgYW5kICcqJyBub3QgaW4gdDoKICAgICAgICBnW3ZlcnRpY2VzW2ZdXS5hcHBlbmQodmVydGljZXNbdF0pCiAgICBlbGlmICcqJyBub3QgaW4gZjoKICAgICAgICBmID0gdmVydGljZXNbZl0KICAgICAgICB0ID0gcmUuc3ViKCdcKicsICcnLCB0KQogICAgICAgIGZvciBuYW1lIGluIHZlcnRpY2VzOgogICAgICAgICAgICBpZiB0IGluIG5hbWU6IGdbZl0uYXBwZW5kKHZlcnRpY2VzW25hbWVdKQogICAgZWxpZiAnKicgbm90IGluIHQ6CiAgICAgICAgZiA9IHJlLnN1YignXConLCAnJywgZikKICAgICAgICB0ID0gdmVydGljZXNbdF0KICAgICAgICBmb3IgbmFtZSBpbiB2ZXJ0aWNlczoKICAgICAgICAgICAgaWYgZiBpbiBuYW1lOiBnW3ZlcnRpY2VzW25hbWVdXS5hcHBlbmQodCkKICAgIGVsc2U6CiAgICAgICAgZmYgPSByZS5zdWIoJ1wqJywgJycsIGYpCiAgICAgICAgdHQgPSByZS5zdWIoJ1wqJywgJycsIHQpCiAgICAgICAgZm9yIG5hbWUgaW4gdmVydGljZXM6CiAgICAgICAgICAgIGlmIGZmIGluIG5hbWU6IGFkZF9lZGdlcyhnLCBuYW1lLCB0LCB2ZXJ0aWNlcykKICAgICAgICAgICAgaWYgdHQgaW4gbmFtZTogYWRkX2VkZ2VzKGcsIGYsIG5hbWUsIHZlcnRpY2VzKQogICAgICAgICAgIAogICAgICAgICAgIAppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgd2FybmluZyA9ICJXYXJuaW5nOiAnJXMnIGRvZXMgbm90IGhhdmUgYW55IG9yZGVyaW5nLiIKICAgIE4sIE0gPSBbaW50KHRva2VuKSBmb3IgdG9rZW4gaW4gcmF3X2lucHV0KCkuc3BsaXQoKV0KCiAgICB2ZXJ0aWNlcyA9IHt9CiAgICB2ZXJ0ZXhfbmFtZXMgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UoTik6CiAgICAgICAgdmVydGV4X25hbWVzLmFwcGVuZChyYXdfaW5wdXQoKSkKICAgICAgICB2ZXJ0aWNlc1t2ZXJ0ZXhfbmFtZXNbLTFdXSA9IGkKCiAgICBnID0ge3Y6W10gZm9yIHYgaW4gdmVydGljZXMudmFsdWVzKCl9CiAgICBmb3IgaSBpbiByYW5nZShNKToKICAgICAgICBmLCB0ID0gcmF3X2lucHV0KCkuc3BsaXQoKQogICAgICAgIGFkZF9lZGdlcyhnLCBmLCB0LCB2ZXJ0aWNlcykKCiAgICBoYXNfb3JkZXIgPSBbRmFsc2UgZm9yIGkgaW4gcmFuZ2UoTildCiAgICBmb3IgdiBpbiBnOgogICAgICAgIGZvciB3IGluIGdbdl06IGhhc19vcmRlclt3XSA9IFRydWUKICAgICAgICBpZiBnW3ZdOiBoYXNfb3JkZXJbdl0gPSBUcnVlCgogICAgb2QgPSAxCiAgICBmb3IgcCBpbiB0b3BvbG9naWNhbChnKToKICAgICAgICBwcmludCBzdHIob2QpKycuICcrJywgJy5qb2luKHZlcnRleF9uYW1lc1tpXSBmb3IgaSBpbiBwIGlmIGhhc19vcmRlcltpXSkKICAgICAgICBvZCArPSAxCgogICAgaWYgbm90IGFsbChoYXNfb3JkZXIpOgogICAgICAgIGZvciBpIGluIHJhbmdlKE4pOgogICAgICAgICAgICBpZiBub3QgaGFzX29yZGVyW2ldOiBwcmludCB3YXJuaW5nICUgKHZlcnRleF9uYW1lc1tpXSk=