#include <cstdio>#include <limits>#include <algorithm>#include <functional>int zju[1000];int rate[5000];int range[30][2];int dp[30];inline int rating(int x, int l, int r){ if(x >= l) return x - l + 1; else if(x <= r) return r - x + 1; else return 0;}int main(void){ int n, m, cnt; while(scanf("%d%d", &n, &m) != EOF) { for (int i = 0; i < n; i++) scanf("%d", &zju[i]); for (int i = 0; i < m; i++) scanf("%d", &rate[i]); if(m == 0) { printf("%dn", 0); continue; } cnt = (m + 24) / 25; std::sort(zju, zju + n, std::greater<int>()); std::sort(rate, rate + m, std::greater<int>()); int ans = std::numeric_limits<int>::max() / 2; for (int i = 0; i <= cnt; i++) { int t = i, c = 0; while(t < m) { dp[c + 1] = std::numeric_limits<int>::max() / 2; if(t == 0) range[c][0] = std::numeric_limits<int>::max() / 2; else range[c][0] = rate[t - 1]; range[c][1] = rate[t]; t += cnt; ++c; } if(t == m && (m + c + 24) / 25 == cnt && (m + c + 24 + 1) / 25 == cnt + 1) { range[c][0] = rate[t - 1]; range[c][1] = std::numeric_limits<int>::min() / 2; ++c; } if(c > n || (m + c + 24) / 25 == cnt) continue; for (int j = 0; j < n; j++) for (int k = c - 1; k >= 0; k--) dp[k + 1] = std::min(dp[k + 1], dp[k] + rating(zju[j], range[k][0], range[k][1])); ans = std::min(ans, dp[c]); } if(ans == std::numeric_limits<int>::max() / 2) printf("Impossiblen"); else printf("%dn", ans); } return 0;}