// 题意就是 n经过和m 的+ - * % 后的结果%k后 与最初的(n+1)%k 是否会相等 要是存在
// 那么 求最少的步数
// 明显的模拟加bfs 不过我却忽略了2个重点:
// 1. 这里 % 是 mod 就是结果必须非负
// 2. a%k%m!=a%m%k
// 第一点比较好解决
// 第二点就是 a%km%m==a%m%km a%km%k=a%k%km 所以这个也就解决了 注:km=k*m
#include <iostream>
#include <math.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxm 10010
#define maxn 1000010
bool vi[maxn];
int from[maxn],ch[maxn];
int dis[maxn];
void out(int u){
if(u!=from[u])
{
out(from[u]);
printf("%c",ch[u]);
}
}
int main()
{
int n,m,k;
int km;
int i;
int u,v,t;
int ans,flag;
while(scanf("%d %d %d",&n,&k,&m),n|k|m){
memset(vi,0,sizeof(vi));
km=k*m;
for(i=0;i<=km;i++) from[i]=i;
ans=((n+1)%k+k)%k;
queue<int> Q;
n=(n%km+km)%km;
Q.push(n);
vi[n]=1;
dis[n]=0;
flag=0;
while(!Q.empty()){
t=u=Q.front();
Q.pop();
if(u%k==ans){flag=1;break;}
v=((u+m)%km+km)%km;
if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='+';Q.push(v);}
v=((u-m)%km+km)%km;
if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='-';Q.push(v);}
v=((u*m)%km+km)%km;
if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='*';Q.push(v);}
v=((u%m)%km+km)%km;
if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='%';Q.push(v);}
}
if(!flag) printf("0
");
else{
printf("%d
",dis[t]);
out(t);
printf("
");
}
}
return 0;
}