#include #define INFTY (1<<20) // Infinity #define UNDET (1<<21) // Undetermined int n, m, p, a, b; int t[8]; int adj[32][32]; int mask[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; int left_tickets[9] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}; // city tickets double min_time[ 32 ][ 256 ]; // min_time[i][j] contains time to reach city-b when the traveler started from city-i with -ticket(s). // -ticket(s) means... if j & mask[k] == mask[k], then the traveler has ticket-k. double tsp(int cur, int left_ticket, int visited[32], double wasted_time) { double local_min = INFTY; if (cur == b) { return wasted_time; } if (left_ticket == 0) { return INFTY; } if (min_time[cur][left_ticket] != UNDET) { return wasted_time + min_time[cur][left_ticket]; } for (int i = 0; i < m; i++) { if (adj[cur][i] < INFTY && !visited[i]) { for (int use_tkt = 0; use_tkt < n; use_tkt++) { if (!(left_ticket & mask[use_tkt])) { continue; } double result; visited[i] = 1; result = tsp(i, (left_ticket &~ mask[use_tkt]), visited, wasted_time + ((double)adj[cur][i]) / (t[use_tkt])); if (result < local_min) { local_min = result; } visited[i] = 0; } } } if (local_min < INFTY) { min_time[cur][left_ticket] = local_min - wasted_time; } else { min_time[cur][left_ticket] = INFTY; } return local_min; } int main() { int i, j, visited[32]; while (1) { scanf("%d%d%d%d%d", &n, &m, &p, &a, &b); if (n == 0) { break; } a--; b--; for (i = 0; i < m; i++) { for (j = 0; j < m; j++) { adj[i][j] = INFTY; } } for (i = 0; i < n; i++) { scanf("%d", &t[i]); } for (i = 0; i < p; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); x--; y--; adj[x][y] = adj[y][x] = z; } for (i = 0; i < m; i++) { visited[i] = 0; } for (i = 0; i < m; i++) { for (j = 0; j <= left_tickets[n]; j++) { min_time[i][j] = UNDET; } } visited[a] = 1; double result = tsp(a, left_tickets[n], visited, 0.0); if (result < INFTY) { printf("%.3lf\n", result); } else { printf("Impossible\n"); } } return 0; }