#include <stdio.h> #include <string.h> int L, M, N, find; int C, lenl, lenr; struct node { int l, w; } left[30], right[30], res[30]; int is_ok(int l, int r) { int lsum = 0, rsum = 0; int i; for (i = 0; i < l; i++) { lsum += (-left[i].l * 2 - 3) * left[i].w; } for (i = 0; i < r; i++) { rsum += (right[i].l * 2 + 3) * right[i].w; } rsum += C; if (lsum > rsum) return 0; lsum = 0, rsum = 0; for (i = 0; i < l; i++) { lsum += (-left[i].l * 2 + 3) * left[i].w; } for (i = 0; i < r; i++) { rsum += (right[i].l * 2 - 3) * right[i].w; } lsum += C; if (rsum > lsum) return 0; return 1; } void dfs(int cur, int l, int r) { int i; if (cur == N) { for (i = cur - 1; i >= 0; i--) printf("%d %d\n", res[i].l, res[i].w); find = 1; return; } for (i = l; i < lenl; i++) { if (is_ok(i, r) && !find) { res[cur].l = left[i].l; res[cur].w = left[i].w; dfs(cur + 1, i + 1, r); } else break; } for (i = r; i < lenr; i++) { if (is_ok(l, i) && !find) { res[cur].l = right[i].l; res[cur].w = right[i].w; dfs(cur + 1, l, i + 1); } else break; } } int main() { #ifndef ONLINE_JUDGE freopen("d:\\UVa\\uva_in.txt", "r", stdin); #endif int cas = 1; int i, j; int u, v; struct node tem; while (scanf("%d%d%d", &L, &M, &N) && L + M + N) { lenl = lenr = 0; for (i = 0; i < N; i++) { scanf("%d%d", &u, &v); if (u < 0) { left[lenl].l = u; left[lenl++].w = v; } else { right[lenr].l = u; right[lenr++].w = v; } } for (i = 1; i < lenl; i++) { for (j = 0; j < lenl - i; j++) { if ((-left[j].l * 2 - 3) * left[j].w > (-left[j + 1].l * 2 - 3) * left[j + 1].w) { tem = left[j]; left[j] = left[j + 1]; left[j + 1] = tem; } } } for (i = 1; i < lenr; i++) { for (j = 0; j < lenr - i; j++) { if ((right[j].l * 2 - 3) * right[j].w > (right[j + 1].l * 2 - 3) * right[j + 1].w) { tem = right[j]; right[j] = right[j + 1]; right[j + 1] = tem; } } } C = 3 * M; printf("Case %d:\n", cas++); find = 0; dfs(0, 0, 0); if (!find) printf("Impossible\n"); } return 0; }