#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;
vector<int> path, res;
int k, p, flag, maxsum;
int getpow(int n)
{
int f = n, i;
for(i = 1; i < p; i++)
{
f *= n;
}
return f;
}
void dfs(int cur, int curn, int curcount, int cursum)
{
if(curn == 0 && curcount == k)
{
flag = 1;
if(cursum > maxsum)
{
maxsum = cursum;
res = path;
}
return;
}
int i, curpow, count;
for(i = cur; i >= 1; i--)
{
curpow = getpow(i);
count = k - curcount;
if(curn <= curpow * count && curn >= count)
{
path.push_back(i);
dfs(i, curn - curpow, curcount + 1, cursum + i);
path.pop_back();
}
}
}
int main()
{
int n;
scanf("%d%d%d", &n, &k, &p);
int i;
for(i = pow(n, 1.0 / p); i >= 1; i--)
{
dfs(i, n, 0, 0);
}
int size;
if(flag == 1)
{
printf("%d = ", n);
size = res.size();
for(i = 0; i < size; i++)
{
if(i > 0)
{
printf(" + ");
}
printf("%d^%d", res[i], p);
}
printf("\n");
}
else
{
printf("Impossible\n");
}
system("pause");
return 0;
}