#include int n; int tr[300][300]; int conn[180000][300]; int conn_c; int calc(int a, int b, int c) { int i; if ((a==-1) || (b==-1)) return c; if (c==-1) { c = conn_c++; } for (i=0; i<30; i++) { if ((conn[a][i] && conn[b][i]) || conn[c][i]) conn[c][i] = 1; } return c; } int toCode(char *s) { int i, index; for (i=0; i < 30; i++) conn[conn_c][i] = 0; while (*s != '\0') { index = *s - 'a'; s++; if ((index<0) || (index>=30)) continue; conn[conn_c][index] = 1; } return conn_c++; } char res[400]; void toString(int code) { int i, pos=0; res[0] = '-'; res[1] = '\0'; if (code == -1) return; for (i=0; i<30; i++) { if (conn[code][i]) { res[pos++] = 'a' + i; res[pos] = '\0'; } } } int main() { FILE *f = fopen("fiber.in", "r"); int a, b, i, j, k; char line[100]; while(1) { for (a=0; a<300; a++) for (b=0; b <300; b++) { tr[a][b]=-1; } if (fscanf(f, "%d\n", &n) != 1) break; if (n==0) break; conn_c = 0; while(1) { if (fscanf(f, "%d %d\n", &a, &b) != 2) break; if ((a==0) && (b==0)) break; if (fscanf(f, "%s\n", line) != 1) break; tr[a-1][b-1] = toCode(line); } for (k=0; k < conn_c; k++) for (i=0; i < conn_c; i++) for (j=0; j < conn_c; j++) tr[i][j] = calc(tr[i][k], tr[k][j], tr[i][j]); while(1) { if (fscanf(f, "%d %d\n", &a, &b) != 2) break; if ((a==0) && (b==0)) break; toString(tr[a-1][b-1]); printf("%s\n", res); } printf("\n"); } return 0; }