#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
using namespace std;
struct edge {
int to, v, label;
edge(int a=0, int b=0, int c=0):
to(a), v(b), label(c){}
};
vector<edge> g[128];
int mxfloor[128], mnfloor[128], T[128];
int dist[128], inq[128];
void spfa(int N, int K) {
for (int i = 0; i < 128; i++)
dist[i] = 0x3f3f3f3f;
int u, v, w, l;
queue<int> Q;
Q.push(0), dist[0] = 0;
while (!Q.empty()) {
u = Q.front(), Q.pop();
inq[u] = 0;
for (int i = 0; i < g[u].size(); i++) {
v = g[u][i].to, l = g[u][i].label;
w = g[u][i].v + T[l] * max(mxfloor[l] - u, u - mnfloor[l]) + 5;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
if (!inq[v]) {
inq[v] = 1;
Q.push(v);
}
}
}
}
if (dist[K] == 0x3f3f3f3f)
puts("IMPOSSIBLE");
else
printf("%d\n", K == 0 ? 0 : (dist[K] - 5));
}
int main() {
int N, K, f[128];
char s[1024];
while (scanf("%d %d", &N, &K) == 2) {
for (int i = 0; i < N; i++)
scanf("%d", &T[i]);
for (int i = 0; i < 128; i++)
g[i].clear();
while (getchar() != '\n');
for (int i = 0; i < N; i++) {
gets(s);
stringstream sin(s);
int n = 0;
while (sin >> f[n])
n++;
mxfloor[i] = -1, mnfloor[i] = 0x3f3f3f3f;
for (int j = 0; j < n; j++) {
mxfloor[i] = max(mxfloor[i], f[j]);
mnfloor[i] = min(mnfloor[i], f[j]);
for (int k = 0; k < n; k++) {
if (j == k) continue;
g[f[j]].push_back(edge(f[k], abs(f[k] - f[j]) * T[i], i));
}
}
}
spfa(N, K);
}
return 0;
}
2 30
10 5
0 1 3 5 7 9 11 13 15 20 99
4 13 15 19 20 25 30
2 30
10 1
0 5 10 12 14 20 25 30
2 4 6 8 10 12 14 22 25 28 29
3 50
10 50 100
0 10 30 40
0 20 30
0 20 50
1 1
2
0 2 4 6 8 10
*/