#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL N=1000005;
const LL MOD=998242353;
LL pow[N];
char ss[N];
LL len;
LL a[N],b[N];//前缀，后缀
LL sum=0;
LL calc (LL l,LL r)//l到r的值是什么
{
	return ((sum-b[r+1]-a[l-1]*pow[len-l+1]%MOD)%MOD+MOD)%MOD;
}
bool check (LL l,LL r)//这一段是不是
{
	if (l<=0) return false;
	if (l+1>r-1)  return false;
	if (((r-1)-(l+1)+1!=1)&&ss[l+1]=='0') return false;
	if (l!=1&&ss[1]=='0') return false;
	LL lalal=((b[r]-a[l])%MOD+MOD)%MOD;
	lalal=lalal*pow[len-r+1]%MOD;
	if (lalal==calc(l+1,r-1))
		return true;
	return false;
}
int main()
{
	pow[0]=1;for (LL u=1;u<=1000000;u++) pow[u]=pow[u-1]*10%MOD;
	scanf("%s",ss+1);len=strlen(ss+1);
	for (LL u=1;u<=len;u++) sum=(sum*10+ss[u]-'0')%MOD;
	for (LL u=1;u<=len;u++) a[u]=(a[u-1]*10+ss[u]-'0')%MOD;
/*	for (LL u=1;u<=len;u++) printf("%d ",a[u]);
	printf("\n");*/
	for (LL u=len;u>=1;u--) b[u]=(b[u+1]+(ss[u]-'0')*pow[len-u])%MOD;
	LL ans,ans1;
	for (LL u=len;u>=3;u--)//在谁前面加上=好
	{
		LL t=len-u+1;
		if (t!=1&&ss[u]=='0') continue;
		LL i=len-u+1;//第几个数字后面
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	//	if (t==9) printf("YES");
		i=u-t;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	}
	if (ans!=0)
	{
	for (LL u=1;u<=len;u++)
	{
		if (u==ans) printf("=");
		printf("%c",ss[u]);
		if (u==ans1) printf("+");
	}
	}
	return 0;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL N=1000005;
const LL MOD=1e9+7;
LL pow[N];
char ss[N];
LL len;
LL a[N],b[N];//前缀，后缀
LL sum=0;
LL calc (LL l,LL r)//l到r的值是什么
{
	return ((sum-b[r+1]-a[l-1]*pow[len-l+1]%MOD)%MOD+MOD)%MOD;
}
bool check (LL l,LL r)//这一段是不是
{
	if (l<=0) return false;
	if (l+1>r-1)  return false;

	LL lalal=((b[r]-a[l])%MOD+MOD)%MOD;

	lalal=lalal*pow[len-r+1]%MOD;
	if (lalal==calc(l+1,r-1))
		return true;
	return false;
}
int main()
{
	pow[0]=1;for (LL u=1;u<=1000000;u++) pow[u]=pow[u-1]*10%MOD;
	scanf("%s",ss+1);len=strlen(ss+1);
	for (LL u=1;u<=len;u++) sum=(sum*10+ss[u]-'0')%MOD;
	for (LL u=1;u<=len;u++) a[u]=(a[u-1]*10+ss[u]-'0')%MOD;
/*	for (LL u=1;u<=len;u++) printf("%d ",a[u]);
	printf("\n");*/
	for (LL u=len;u>=1;u--) b[u]=(b[u+1]+(ss[u]-'0')*pow[len-u])%MOD;
	LL ans,ans1;
	for (LL u=len;u>=3;u--)//在谁前面加上=好
	{
		LL i=len-u+1;//第几个数字后面
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		LL t=len-u+1;
		i=u-t;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i++;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	}
	for (LL u=1;u<=len;u++)
	{
		if (u==ans) printf("=");
		printf("%c",ss[u]);
		if (u==ans1) printf("+");
	}
	return 0;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL N=1000005;
const LL MOD=1e9+7;
LL pow[N];
char ss[N];
LL len;
LL a[N],b[N];//前缀，后缀
LL sum=0;
LL calc (LL l,LL r)//l到r的值是什么
{
	return ((sum-b[r+1]-a[l-1]*pow[len-l+1]%MOD)%MOD+MOD)%MOD;
}
bool check (LL l,LL r)//这一段是不是
{
	if (l<=0) return false;
	if (l+1>r-1)  return false;
	if (((r-1)-(l+1)+1!=1)&&ss[l+1]=='0') return false;
	if (l!=1&&ss[1]=='0') return false;
	LL lalal=((b[r]-a[l])%MOD+MOD)%MOD;
	//LL lalal=b[r]-a[l];

/*	if (l==6&&r==16)
	{
	}*/lalal=lalal*pow[len-r+1]%MOD;
	if (lalal==calc(l+1,r-1))
		return true;
	return false;
}
int main()
{
	pow[0]=1;for (LL u=1;u<=1000000;u++) pow[u]=pow[u-1]*10%MOD;
	scanf("%s",ss+1);len=strlen(ss+1);
	for (LL u=1;u<=len;u++) sum=(sum*10+ss[u]-'0')%MOD;
	for (LL u=1;u<=len;u++) a[u]=(a[u-1]*10+ss[u]-'0')%MOD;
/*	for (LL u=1;u<=len;u++) printf("%d ",a[u]);
	printf("\n");*/
	for (LL u=len;u>=1;u--) b[u]=(b[u+1]+(ss[u]-'0')*pow[len-u])%MOD;
	LL ans,ans1;
	for (LL u=len;u>=3;u--)//在谁前面加上=好
	{
		LL t=len-u+1;
		if (t!=1&&ss[u]=='0') continue;
		LL i=len-u+1;//第几个数字后面
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	//	if (t==9) printf("YES");
		i=u-t;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	}
	if (ans!=0)
	{
	for (LL u=1;u<=len;u++)
	{
		if (u==ans) printf("=");
		printf("%c",ss[u]);
		if (u==ans1) printf("+");
	}
	}
	return 0;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL N=1000005;
const LL MOD=200815147;
LL pow[N];
char ss[N];
LL len;
LL a[N],b[N];//前缀，后缀
LL sum=0;
LL calc (LL l,LL r)//l到r的值是什么
{
	return ((sum-b[r+1]-a[l-1]*pow[len-l+1]%MOD)%MOD+MOD)%MOD;
}
bool check (LL l,LL r)//这一段是不是
{
	if (l<=0) return false;
	if (l+1>r-1)  return false;
	if (((r-1)-(l+1)+1!=1)&&ss[l+1]=='0') return false;
	if (l!=1&&ss[1]=='0') return false;
	LL lalal=((b[r]-a[l])%MOD+MOD)%MOD;
	lalal=lalal*pow[len-r+1]%MOD;
	if (lalal==calc(l+1,r-1))
		return true;
	return false;
}
int main()
{
	pow[0]=1;for (LL u=1;u<=1000000;u++) pow[u]=pow[u-1]*10%MOD;
	scanf("%s",ss+1);len=strlen(ss+1);
	for (LL u=1;u<=len;u++) sum=(sum*10+ss[u]-'0')%MOD;
	for (LL u=1;u<=len;u++) a[u]=(a[u-1]*10+ss[u]-'0')%MOD;
/*	for (LL u=1;u<=len;u++) printf("%d ",a[u]);
	printf("\n");*/
	for (LL u=len;u>=1;u--) b[u]=(b[u+1]+(ss[u]-'0')*pow[len-u])%MOD;
	LL ans,ans1;
	for (LL u=len;u>=3;u--)//在谁前面加上=好
	{
		LL t=len-u+1;
		if (t!=1&&ss[u]=='0') continue;
		LL i=len-u+1;//第几个数字后面
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	//	if (t==9) printf("YES");
		i=u-t;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	}
	if (ans!=0)
	{
	for (LL u=1;u<=len;u++)
	{
		if (u==ans) printf("=");
		printf("%c",ss[u]);
		if (u==ans1) printf("+");
	}
	}
	return 0;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL N=1000005;
const LL MOD=1e9+7;
LL pow[N];
char ss[N];
LL len;
LL a[N],b[N];//前缀，后缀
LL sum=0;
LL calc (LL l,LL r)//l到r的值是什么
{
	return ((sum-b[r+1]-a[l-1]*pow[len-l+1]%MOD)%MOD+MOD)%MOD;
}
bool check (LL l,LL r)//这一段是不是
{
	if (l<=0) return false;
	if (l+1>r-1)  return false;
	LL lalal=((b[r]-a[l])%MOD+MOD)%MOD;

	//LL lalal=b[r]-a[l];

/*	if (l==6&&r==16)
	{
	}*/lalal=lalal*pow[len-r+1]%MOD;
	if (lalal==calc(l+1,r-1))
		return true;
	return false;
}
int main()
{
	pow[0]=1;for (LL u=1;u<=1000000;u++) pow[u]=pow[u-1]*10%MOD;
	scanf("%s",ss+1);len=strlen(ss+1);
	for (LL u=1;u<=len;u++) sum=(sum*10+ss[u]-'0')%MOD;
	for (LL u=1;u<=len;u++) a[u]=(a[u-1]*10+ss[u]-'0')%MOD;
/*	for (LL u=1;u<=len;u++) printf("%d ",a[u]);
	printf("\n");*/
	for (LL u=len;u>=1;u--) b[u]=(b[u+1]+(ss[u]-'0')*pow[len-u])%MOD;
	LL ans,ans1;
	for (LL u=len;u>=3;u--)//在谁前面加上=好
	{
		LL i=len-u+1;//第几个数字后面
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		LL t=len-u+1;
	//	if (t==9) printf("YES");
		i=u-t;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
		i--;
		if (check(i,u))
		{
			ans=u;ans1=i;
			break;
		}
	}
	if (ans!=0)
	{
	for (LL u=1;u<=len;u++)
	{
		if (u==ans) printf("=");
		printf("%c",ss[u]);
		if (u==ans1) printf("+");
	}
	}
	return 0;
}


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
const int maxn=1e6+7,w=10;
int len;
typedef long long ll;
struct hash
{
    ll P;
    ll mi_w[maxn];
    ll hs[maxn];
    void init(char *s)
    {
        P=1e9+rand();
        mi_w[0]=1;
        for(int i=1; i<=len; i++)
            mi_w[i]=mi_w[i-1]*w%P;
        for(int i=1; i<=len; i++)
            hs[i]=(hs[i-1]*w+s[i]-'0')%P;
    }
    ll get(int l,int r)
    {
        return (hs[r]-hs[l-1]*mi_w[r-l+1])%P;
    }
    bool ok(int l,int r)
    {
        return (get(1,l)+get(l+1,r)-get(r+1,len))%P==0;
    }
} h[2];
char s[maxn];
int check(int l,int r)
{
    if(l<1||r-l<1||r>len)return 0;
    if((s[1]!='0'||l==1)&&(s[l+1]!='0'||l+1==r)&&(s[r+1]!='0'||r+1==len)&&h[1].ok(l,r))
    {
        for(int k=1; k<=l; k++)
            putchar(s[k]);
        putchar('+');
        for(int k=l+1; k<=r; k++)
            putchar(s[k]);
        putchar('=');
        for(int k=r+1; k<=len; k++)
            putchar(s[k]);
        puts("");
        return 1;
    }
    return 0;
}
int main()
{
    srand(time(0));
    scanf("%s",s+1);
    len=strlen(s+1);
    h[0].init(s);
    h[1].init(s);
    for(int i=len/2-1;i<=len;i++)
    {
        if(check(len-i,i))break;
        if(check(len-i-1,i))break;
        if(check(len-i+1,i))break;
        if(check(i-len+i,i))break;
        if(check(i-len+i-1,i))break;
        if(check(i-len+i+1,i))break;
    }
}/*2018-02-04 19:56:08.816*/


#include<iostream>

using namespace std;

const int MAXN = 1000005;

int n, naso;
int mod[10]={179426561, 179427007, 179427461, 179428003, 1000000007};
int h[MAXN] [10], pot[MAXN] [10];
string s;

int add (int x, int y, int ind) {
	x+=y;
	if (x>=mod[ind]) return x-mod[ind]; return x;
}

int sub (int x, int y, int ind) {
	x-=y;
	if (x<0) return x+mod[ind]; return x;
}

int mul (int x, int y, int ind) {
	return ((long long) x)*y%mod[ind];
}

int geth (int x, int y, int ind) {
	if (x==0) return h[y] [ind]; return sub(h[y] [ind], mul(h[x-1] [ind], pot[y-x+1] [ind], ind), ind);
}

void ok (int a, int b) {
	if (naso || a>=b || s[a]=='0' || s[b]=='0') return;
	//cout << "bok" << endl;
	for (int i=0; i<5; i++) {
		int x=geth(0, a-1, i);
		int y=geth(a, b-1, i);
		int z=geth(b, n-1, i);
		//cout << "bla " << x << " " << y << " " << z << endl;
		if (add(x, y, i)!=z) return;
	}
	naso=1;
	cout << s.substr(0, a) << "+" << s.substr(a, b-a) << "=" << s.substr(b, n-b);
}

void nadi () {
	if (n&1) {
		if (s[0]=='0' && s.substr(1, n/2)==s.substr(n/2+1, n/2)) {
			naso=1;
			cout << "0+" << s.substr(1, n/2) << "=" << s.substr(n/2+1, n/2);
		} else if (s[n/2]=='0' && s.substr(0, n/2)==s.substr(n/2+1, n/2)) {
			naso=1;
			cout << s.substr(0, n/2) << "+0=" << s.substr(n/2+1, n/2);
		}
	}
	int a, b;
	for (int i=0; i<n; i++) {
		a=i+1, b=n-i-1;
		ok(a, b);
		a=i+1, b=n-i-2;
		ok(a, b);
		a=n-2*i-2, b=n-i-1;
		ok(a, b);
		a=n-2*i-3, b=n-i-2;
		ok(a, b);
	}
}

int main () {
	cin >> s;
	n=s.size();
	for (int i=0; i<n; i++) {
		for (int j=0; j<5; j++) {
			h[i] [j]=s[i]-'0';
			if (i>0) h[i] [j]=add(h[i] [j], mul(h[i-1] [j], 10, j), j);
			if (i==0) {
				pot[i] [j]=1;
			} else {
				pot[i] [j]=mul(pot[i-1] [j], 10, j);
			}
		}
	}
	nadi();
	return 0;
}


#include<cstdio>
#include<cstring>
#define N 1000005
bool find=0;
char s[N];
int q[5]={23333,66666,576345,234455,1000007};
int n,p[N][5],mi[N][5];
int split(int i,int l,int r)
{
	return p[r][i]-1ll*p[l-1][i]*mi[r-l+1][i]%q[i];
}
void check(int a,int b)
{
	if(s[a+1]==0 && b-a>=2)return;
	if(s[b+1]==0 && n-b>=2)return;
	if(a<1)return;
	if(b>=n)return;
	if(a>=b)return;
	if(find)return;
	for(int i=0;i<5;++i)
		if((split(i,1,a)+split(i,a+1,b)-split(i,b+1,n))%q[i])return;
	find=1;
	for(int i=1;i<=a;++i)
		putchar(s[i]+48);
	putchar('+');
	for(int i=a+1;i<=b;++i)
		putchar(s[i]+48);
	putchar('=');
	for(int i=b+1;i<=n;++i)
		putchar(s[i]+48);
}
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	for(int i=1;i<=n;++i)s[i]-=48;
	for(int i=0;i<5;++i)mi[0][i]=1;
	for(int i=1;i<=n;++i)
		for(int j=0;j<5;++j)
		{
			p[i][j]=(p[i-1][j]*10ll+s[i])%q[j];
			mi[i][j]=mi[i-1][j]*10ll%q[j];
		}
	for(int i=n/2;i<=n;++i)
	{
		check(n-i-1,i);
		check(n-i,i);
		check(n-i+1,i);
		check(i-(n-i)-1,i);
		check(i-(n-i),i);
		check(i-(n-i)+1,i);
	}
}


#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define P 10
#define N 1000001
#define MOD 19260817
#define LL long long
string s;
LL f[N];
LL qow(LL x,LL y){return y?(y&1?x*qow(x,y-1)%MOD:qow(x*x%MOD,y/2)):1;}
void print(LL x,LL y)
{
	for(LL i=0;i<s.size();i++)
	  {
	  if(i==x)printf("+");
	  if(i==y)printf("=");
	  printf("%c",s[i]);
	  }
}
bool check(LL x,LL y)
{
	LL a=(f[0]-f[x])*qow(qow(P,s.size()-x),MOD-2);
	LL b=(f[x]-f[y])*qow(qow(P,s.size()-y),MOD-2);
	LL c=f[y];
	if((a+b)%MOD==c)return print(x,y),true;
	return false;
}
int main()
{
	cin>>s;
	for(LL i=0;i<s.size();i++)
	  f[s.size()-i-1]=(f[s.size()-i]+(s[s.size()-i-1]-'0')*qow(P,i))%MOD;
	//cout<<f[1]<<endl<<f[3]<<endl;
	for(LL i=s.size()-s.size()/3;i>=s.size()/2;i--)
	  {
	  if(s[i]=='0')continue;
	  if(check(s.size()-i,i) || check(2*i-s.size(),i))return 0;
	  if(s[i]=='1')if(check(s.size()-i-1,i) || check(2*i-s.size()+1,i))return 0;
	  }
	return 0;
}


#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define P 10
#define N 1000001
#define MOD 19260817
#define LL long long
string s;
LL f[N];
LL qow(LL x,LL y){return y?(y&1?x*qow(x,y-1)%MOD:qow(x*x%MOD,y/2)):1;}
void print(LL x,LL y)
{
	for(LL i=0;i<s.size();i++)
	  {
	  if(i==x)printf("+");
	  if(i==y)printf("=");
	  printf("%c",s[i]);
	  }
}
bool check(LL x,LL y)
{
	//cout<<x<<" "<<y<<" "<<endl;
	LL a=(f[0]+MOD-f[x])%MOD*qow(qow(P,s.size()-x),MOD-2)%MOD;
	LL b=(f[x]+MOD-f[y])%MOD*qow(qow(P,s.size()-y),MOD-2)%MOD;
	LL c=f[y];
	//cout<<a<<" "<<b<<" "<<c<<endl;
	if((a+b)%MOD==c)return print(x,y),true;
	return false;
}
int main()
{
	cin>>s;
	for(LL i=0;i<s.size();i++)
	  f[s.size()-i-1]=(f[s.size()-i]+(s[s.size()-i-1]-'0')*qow(P,i))%MOD;
	//cout<<f[1]<<endl<<f[3]<<endl;
	for(LL i=s.size()-s.size()/3;i>=s.size()/2;i--)
	  {
	  if(s[i]=='0')continue;
	  if(check(s.size()-i,i) || check(2*i-s.size(),i))return 0;
	  if(s[i]=='1')if(check(s.size()-i-1,i) || check(2*i-s.size()+1,i))return 0;
	  }
	return 0;
}


#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define P 10
#define N 1000001
#define MOD 19260817
#define LL long long
string s;
LL f[N];
LL qow(LL x,LL y){return y?(y&1?x*qow(x,y-1)%MOD:qow(x*x%MOD,y/2)):1;}
void print(LL x,LL y)
{
	for(LL i=0;i<s.size();i++)
	  {
	  if(i==x)printf("+");
	  if(i==y)printf("=");
	  printf("%c",s[i]);
	  }
}
bool check(LL x,LL y)
{
	//cout<<x<<" "<<y<<" "<<endl;
	LL a=(f[0]+MOD-f[x])%MOD*qow(qow(P,s.size()-x),MOD-2)%MOD;
	LL b=(f[x]+MOD-f[y])%MOD*qow(qow(P,s.size()-y),MOD-2)%MOD;
	LL c=f[y];
	//cout<<a<<" "<<b<<" "<<c<<endl;
	if((a+b)%MOD==c)return print(x,y),true;
	return false;
}
int main()
{
	cin>>s;
	if(s=="000")return printf("0+0=0\n"),0;
	for(LL i=0;i<s.size();i++)
	  f[s.size()-i-1]=(f[s.size()-i]+(s[s.size()-i-1]-'0')*qow(P,i))%MOD;
	//cout<<f[1]<<endl<<f[3]<<endl;
	for(LL i=s.size()-s.size()/3;i>=s.size()/2;i--)
	  {
	  if(s[i]=='0')continue;
	  if(check(s.size()-i,i) || check(2*i-s.size(),i))return 0;
	  if(s[i]=='1')if(check(s.size()-i-1,i) || check(2*i-s.size()+1,i))return 0;
	  }
	return 0;
}


#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define P 10
#define N 1000001
#define MOD 19260817
#define LL long long
string s;
LL f[N];
LL qow(LL x,LL y){return y?(y&1?x*qow(x,y-1)%MOD:qow(x*x%MOD,y/2)):1;}
void print(LL x,LL y)
{
	for(LL i=0;i<s.size();i++)
	  {
	  if(i==x)printf("+");
	  if(i==y)printf("=");
	  printf("%c",s[i]);
	  }
}
bool check(LL x,LL y)
{
	if(s[x]=='0' && y-x>1)return false;
	//cout<<x<<" "<<y<<" "<<endl;
	LL a=(f[0]+MOD-f[x])%MOD*qow(qow(P,s.size()-x),MOD-2)%MOD;
	LL b=(f[x]+MOD-f[y])%MOD*qow(qow(P,s.size()-y),MOD-2)%MOD;
	LL c=f[y];
	//cout<<a<<" "<<b<<" "<<c<<endl;
	if((a+b)%MOD==c)return print(x,y),true;
	return false;
}
int main()
{
	cin>>s;
	if(s=="000")return printf("0+0=0\n"),0;
	for(LL i=0;i<s.size();i++)
	  f[s.size()-i-1]=(f[s.size()-i]+(s[s.size()-i-1]-'0')*qow(P,i))%MOD;
	//cout<<f[1]<<endl<<f[3]<<endl;
	for(LL i=s.size()-s.size()/3;i>=s.size()/2;i--)
	  {
	  if(s[i]=='0')continue;
	  if(check(s.size()-i,i) || check(2*i-s.size(),i))return 0;
	  if(s[i]=='1')if(check(s.size()-i-1,i) || check(2*i-s.size()+1,i))return 0;
	  }
	return 0;
}


#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define P 10
#define N 1000001
#define MOD 506403593
#define LL long long
string s;
LL f[N];
LL qow(LL x,LL y){return y?(y&1?x*qow(x,y-1)%MOD:qow(x*x%MOD,y/2)):1;}
void print(LL x,LL y)
{
	for(LL i=0;i<s.size();i++)
	  {
	  if(i==x)printf("+");
	  if(i==y)printf("=");
	  printf("%c",s[i]);
	  }
}
bool check(LL x,LL y)
{
	if(s[x]=='0' && y-x>1)return false;
	//cout<<x<<" "<<y<<" "<<endl;
	LL a=(f[0]+MOD-f[x])%MOD*qow(qow(P,s.size()-x),MOD-2)%MOD;
	LL b=(f[x]+MOD-f[y])%MOD*qow(qow(P,s.size()-y),MOD-2)%MOD;
	LL c=f[y];
	//cout<<a<<" "<<b<<" "<<c<<endl;
	if((a+b)%MOD==c)return print(x,y),true;
	return false;
}
int main()
{
	cin>>s;
	if(s=="000")return printf("0+0=0\n"),0;
	for(LL i=0;i<s.size();i++)
	  f[s.size()-i-1]=(f[s.size()-i]+(s[s.size()-i-1]-'0')*qow(P,i))%MOD;
	//cout<<f[1]<<endl<<f[3]<<endl;
	for(LL i=s.size()-s.size()/3;i>=s.size()/2;i--)
	  {
	  if(s[i]=='0')continue;
	  if(check(s.size()-i,i) || check(2*i-s.size(),i))return 0;
	  if(s[i]=='1')if(check(s.size()-i-1,i) || check(2*i-s.size()+1,i))return 0;
	  }
	return 0;
}


/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
    int xx=0,ff=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
    return xx*ff;
}
const int maxn=1000010;
char s[maxn];
int len;
int MOD[5]={0,1000000007,19797571,73715923,92431371};
//int MOD[5]={0,1000000,1000000,1000000,1000000};
int Hash[5][maxn];
int mypow(int a,int p,int mod){
	int re=1;
	while(p){
		if(p&1)
			re=1LL*re*a%mod;
		p>>=1;
		a=1LL*a*a%mod;
	}
	return re;
}
int get_Hash(int xx,int yy,int mod){
	//printf("%d %d %d %d %d\n",xx,yy,Hash[mod][yy],Hash[mod][xx-1],mypow(10,yy-xx+1,MOD[mod]));
	return ((Hash[mod][yy]-1LL*Hash[mod][xx-1]*mypow(10,yy-xx+1,MOD[mod]))%MOD[mod]+MOD[mod])%MOD[mod];
}
bool check(int x,int y){
	if(s[1]=='0'&&x-1>0)
		return 0;
	if(s[x+1]=='0'&&y-(x+1)>0)
		return 0;
	if(s[y+1]=='0'&&len-(y+1)>0)
	for(int i=1;i<=4;i++)
		if((1LL*get_Hash(1,x,i)+get_Hash(x+1,y,i))%MOD[i]!=get_Hash(y+1,len,i))
			return 0;
	return 1;
}
int main(){
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	gets(s+1);
	len=strlen(s+1);
	for(int i=1;i<=4;i++)
		for(int j=1;j<=len;j++)
			Hash[i][j]=(1LL*Hash[i][j-1]*10+s[j]-'0')%MOD[i];
	/*for(int i=1;i<=4;i++){
		for(int j=0;j<=len;j++)
			printf("%d ",Hash[i][j]);
		puts("");
	}*/
	int i,j;
	for(i=1;i<=len/2-(len%2==0);i++){
		j=len-i;
		if(j/2+(j%2==1)>=i){
			j=i+(j/2);
			if(check(i,j))
				break;
		}
		else{
			j=len-i;
			if(i==j)
				break;
			if(check(i,j))
				break;
			j=len-i-1;
			if(check(i,j))
					break;
		}
	}
	for(int k=1;k<=len;k++){
		printf("%c",s[k]);
		if(k==i)
			printf("+");
		else if(k==j)
			printf("=");
	}
	puts("");
	return 0;
}


/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
    int xx=0,ff=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
    return xx*ff;
}
const int maxn=1000010;
char s[maxn];
int len;
int MOD[5]={0,1000000007,19797571,73715923,92431371};
//int MOD[5]={0,1000000,1000000,1000000,1000000};
int Hash[5][maxn];
int mypow(int a,int p,int mod){
	int re=1;
	while(p){
		if(p&1)
			re=1LL*re*a%mod;
		p>>=1;
		a=1LL*a*a%mod;
	}
	return re;
}
int get_Hash(int xx,int yy,int mod){
	//printf("%d %d %d %d %d\n",xx,yy,Hash[mod][yy],Hash[mod][xx-1],mypow(10,yy-xx+1,MOD[mod]));
	return ((Hash[mod][yy]-1LL*Hash[mod][xx-1]*mypow(10,yy-xx+1,MOD[mod]))%MOD[mod]+MOD[mod])%MOD[mod];
}
bool check(int x,int y){
	if(s[1]=='0'&&x!=1)
		return 0;
	if(s[x+1]=='0'&&y!=x+1)
		return 0;
	if(s[y+1]=='0'&&len!=y+1)
		return 0;
	for(int i=1;i<=4;i++)
		if((1LL*get_Hash(1,x,i)+get_Hash(x+1,y,i))%MOD[i]!=get_Hash(y+1,len,i))
			return 0;
	return 1;
}
int main(){
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	gets(s+1);
	len=strlen(s+1);
	for(int i=1;i<=4;i++)
		for(int j=1;j<=len;j++)
			Hash[i][j]=(1LL*Hash[i][j-1]*10+s[j]-'0')%MOD[i];
	/*for(int i=1;i<=4;i++){
		for(int j=0;j<=len;j++)
			printf("%d ",Hash[i][j]);
		puts("");
	}*/
	int i,j;
	for(i=1;i<=len/2-(len%2==0);i++){
		j=len-i;
		if(j/2+(j%2==1)>=i){
			j=i+(j/2);
			if(check(i,j))
				break;
		}
		else{
			j=len-i;
			if(i==j)
				break;
			if(check(i,j))
				break;
			j=len-i-1;
			if(check(i,j))
					break;
		}
	}
	for(int k=1;k<=len;k++){
		printf("%c",s[k]);
		if(k==i)
			printf("+");
		else if(k==j)
			printf("=");
	}
	puts("");
	return 0;
}


/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
    int xx=0,ff=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
    return xx*ff;
}
const int maxn=1000010;
char s[maxn];
int len;
int MOD[5]={0,1000000007,19797571,73715923,92431371};
//int MOD[5]={0,1000000,1000000,1000000,1000000};
int Hash[5][maxn];
int mypow(int a,int p,int mod){
	int re=1;
	while(p){
		if(p&1)
			re=1LL*re*a%mod;
		p>>=1;
		a=1LL*a*a%mod;
	}
	return re;
}
int get_Hash(int xx,int yy,int mod){
	//printf("%d %d %d %d %d\n",xx,yy,Hash[mod][yy],Hash[mod][xx-1],mypow(10,yy-xx+1,MOD[mod]));
	return ((Hash[mod][yy]-1LL*Hash[mod][xx-1]*mypow(10,yy-xx+1,MOD[mod]))%MOD[mod]+MOD[mod])%MOD[mod];
}
bool check(int x,int y){
	if(s[1]=='0'&&x!=1)
		return 0;
	if(s[x+1]=='0'&&y!=x+1)
		return 0;
	if(s[y+1]=='0'&&len!=y+1)
		return 0;
	for(int i=1;i<=4;i++)
		if((1LL*get_Hash(1,x,i)+get_Hash(x+1,y,i))%MOD[i]!=get_Hash(y+1,len,i))
			return 0;
	return 1;
}
int main(){
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	gets(s+1);
	len=strlen(s+1);
	for(int i=1;i<=4;i++)
		for(int j=1;j<=len;j++)
			Hash[i][j]=(1LL*Hash[i][j-1]*10+s[j]-'0')%MOD[i];
	/*for(int i=1;i<=4;i++){
		for(int j=0;j<=len;j++)
			printf("%d ",Hash[i][j]);
		puts("");
	}*/
	int i,j;
	for(i=1;i<=len/2-(len%2==0);i++){
		j=len-i;
		if(j/2+(j%2==1)>i){
			j=i+(j/2);
			if(check(i,j))
				break;
		}
		else{
			j=len-i;
			if(i==j)
				break;
			if(check(i,j))
				break;
			j=len-i-1;
			if(check(i,j))
				break;
		}
	}
	for(int k=1;k<=len;k++){
		printf("%c",s[k]);
		if(k==i)
			printf("+");
		else if(k==j)
			printf("=");
	}
	puts("");
	return 0;
}


/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
    int xx=0,ff=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
    return xx*ff;
}
const int maxn=1000010;
char s[maxn];
int len;
int MOD[5]={0,1000000007,19797571,73715923,92431371};
//int MOD[5]={0,1000000,1000000,1000000,1000000};
int Hash[5][maxn];
int mypow(int a,int p,int mod){
	int re=1;
	while(p){
		if(p&1)
			re=1LL*re*a%mod;
		p>>=1;
		a=1LL*a*a%mod;
	}
	return re;
}
int get_Hash(int xx,int yy,int mod){
	//printf("%d %d %d %d %d\n",xx,yy,Hash[mod][yy],Hash[mod][xx-1],mypow(10,yy-xx+1,MOD[mod]));
	return ((Hash[mod][yy]-1LL*Hash[mod][xx-1]*mypow(10,yy-xx+1,MOD[mod]))%MOD[mod]+MOD[mod])%MOD[mod];
}
bool check(int x,int y){
	if(s[1]=='0'||s[x+1]=='0'||s[y+1]=='0')
		return 0;
	for(int i=1;i<=4;i++)
		if((1LL*get_Hash(1,x,i)+get_Hash(x+1,y,i))%MOD[i]!=get_Hash(y+1,len,i))
			return 0;
	return 1;
}
int main(){
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	gets(s+1);
	len=strlen(s+1);
	for(int i=1;i<=4;i++)
		for(int j=1;j<=len;j++)
			Hash[i][j]=(1LL*Hash[i][j-1]*10+s[j]-'0')%MOD[i];
	/*for(int i=1;i<=4;i++){
		for(int j=0;j<=len;j++)
			printf("%d ",Hash[i][j]);
		puts("");
	}*/
	int i,j;
	for(i=1;i<=len/2-(len%2==0);i++){
		j=len-i;
		if(j/2+(j%2==1)>=i){
			j=i+(j/2);
			if(check(i,j))
				break;
		}
		else{
			j=len-i;
			if(i==j)
				break;
			if(check(i,j))
				break;
			j=len-i-1;
			if(check(i,j))
					break;
		}
	}
	for(int k=1;k<=len;k++){
		printf("%c",s[k]);
		if(k==i)
			printf("+");
		else if(k==j)
			printf("=");
	}
	puts("");
	return 0;
}


/*
Welcome Hacking
Wish You High Rating
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int read(){
    int xx=0,ff=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')ff=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){xx=(xx<<3)+(xx<<1)+ch-'0';ch=getchar();}
    return xx*ff;
}
const int maxn=1000010;
char s[maxn];
int len;
int MOD[5]={0,1000000007,19797571,73715923,92431371};
//int MOD[5]={0,1000000,1000000,1000000,1000000};
int Hash[5][maxn];
int mypow(int a,int p,int mod){
	int re=1;
	while(p){
		if(p&1)
			re=1LL*re*a%mod;
		p>>=1;
		a=1LL*a*a%mod;
	}
	return re;
}
int get_Hash(int xx,int yy,int mod){
	//printf("%d %d %d %d %d\n",xx,yy,Hash[mod][yy],Hash[mod][xx-1],mypow(10,yy-xx+1,MOD[mod]));
	return ((Hash[mod][yy]-1LL*Hash[mod][xx-1]*mypow(10,yy-xx+1,MOD[mod]))%MOD[mod]+MOD[mod])%MOD[mod];
}
bool check(int x,int y){
	for(int i=1;i<=4;i++)
		if((1LL*get_Hash(1,x,i)+get_Hash(x+1,y,i))%MOD[i]!=get_Hash(y+1,len,i))
			return 0;
	return 1;
}
int main(){
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	gets(s+1);
	len=strlen(s+1);
	for(int i=1;i<=4;i++)
		for(int j=1;j<=len;j++)
			Hash[i][j]=(1LL*Hash[i][j-1]*10+s[j]-'0')%MOD[i];
	/*for(int i=1;i<=4;i++){
		for(int j=0;j<=len;j++)
			printf("%d ",Hash[i][j]);
		puts("");
	}*/
	int i,j;
	for(i=1;i<=len/2-(len%2==0);i++){
		j=len-i;
		if(j/2+(j%2==1)>=i){
			j=i+(j/2);
			if(check(i,j))
				break;
		}
		else{
			j=len-i;
			if(i==j)
				break;
			if(check(i,j))
				break;
			j=len-i-1;
			if(check(i,j))
					break;
		}
	}
	for(int k=1;k<=len;k++){
		printf("%c",s[k]);
		if(k==i)
			printf("+");
		else if(k==j)
			printf("=");
	}
	puts("");
	return 0;
}


#include <iostream>
#include <cstdio>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

bool possible(char *a, int na, char *b, int nb, char *c, int nc) {
  if (na == 0 || nb == 0 || nc == 0)
    return false;
  if (nc != max(na, nb) && nc != max(na, nb) + 1)
    return false;
  if (na != 1 && a[0] == '0') return false;
  if (nb != 1 && b[0] == '0') return false;
  if (nc != 1 && c[0] == '0') return false;

  for (int k = 0; k < nc; k++) {
    int i = k % 2 == 0 ? k / 2 : nc - 1 - k / 2;

    int j = na - nc + i;
    int v = j >= 0 && j < na ? a[j] - '0' : 0;

    j = nb - nc + i;
    int u = j >= 0 && j < nb ? b[j] - '0' : 0;

    int s = c[i] - '0';
    if (s != (u + v) % 10 && s != (u + v + 1) % 10)
      return false;
  }
  return true;
}

bool check(char *a, int na, char *b, int nb, char *c, int nc) {
  static char sum[1234567];
  int l = 0;
  int carry = 0;
  for (int i = 0; i < max(na, nb); i++) {
    int u = na - 1 - i < 0 ? 0 : a[na - 1 - i] - '0';
    int v = nb - 1 - i < 0 ? 0 : b[nb - 1 - i] - '0';
    int z = (u + v + carry) % 10;
    carry = (u + v + carry) / 10;
    sum[l++] = '0' + z;
  }
  if (carry) sum[l++] = '1';

  if (l != nc) return false;
  for (int i = 0; i < nc; i++)
    if (sum[i] != c[nc - 1 - i])
      return false;
  return true;
}

char s[1234567];

void output(int na, int nb, int nc) {
for (int i = 0; i < na; i++) printf("%c", s[i]);
      printf("+");
      for (int i = 0; i < nb; i++) printf("%c", s[na+i]);
      printf("=");
      for (int i = 0; i < nc; i++) printf("%c", s[na+nb+i]);
      printf("\n");
}

bool test(int na, int nb, int nc) {
  if (possible(s, na, s + na, nb, s + na + nb, nc)
      && check(s, na, s + na, nb, s + na + nb, nc)) {
    output(na, nb, nc);
    return true;
  }
  return false;
}

int main() {

  cin >> s;
  int n = strlen(s);
  if (n == 3 && s[0] == '0' && s[1] == '0' && s[2] == '0') {
    cout << "0+0=0" << endl;
    return 0;
  }

  for (int na = 1; na < n; na++) {
    int nb = (n - na) / 2;
    int nc = n - na - nb;
    if (test(na, nb, nc)) return 0;

    nc = na;
    nb = n - nc - na;
    if (nb > 0 && test(na, nb, nc)) return 0;

    nc = na + 1;
    nb = n - nc - na;
    if (nb > 0 && test(na, nb, nc)) return 0;
  }
  return 0;
}


#include <iostream>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

bool possible(char *a, int na, char *b, int nb, char *c, int nc) {
  if (na == 0 || nb == 0 || nc == 0)
    return false;
  if (nc != max(na, nb) && nc != max(na, nb) + 1)
    return false;
  if (na != 1 && a[0] == '0') return false;
  if (nb != 1 && b[0] == '0') return false;
  if (nc != 1 && c[0] == '0') return false;

  for (int k = 0; k < nc; k++) {
    int i = k % 2 == 0 ? k / 2 : nc - 1 - k / 2;

    int j = na - nc + i;
    int v = j >= 0 && j < na ? a[j] - '0' : 0;

    j = nb - nc + i;
    int u = j >= 0 && j < nb ? b[j] - '0' : 0;

    int s = c[i] - '0';
    if (s != (u + v) % 10 && s != (u + v + 1) % 10)
      return false;
  }
  return true;
}

bool check(char *a, int na, char *b, int nb, char *c, int nc) {
  static char sum[1234567];
  int l = 0;
  int carry = 0;
  for (int i = 0; i < max(na, nb); i++) {
    int u = na - 1 - i < 0 ? 0 : a[na - 1 - i] - '0';
    int v = nb - 1 - i < 0 ? 0 : b[nb - 1 - i] - '0';
    int z = (u + v + carry) % 10;
    carry = (u + v + carry) / 10;
    sum[l++] = '0' + z;
  }
  if (carry) sum[l++] = '1';

  if (l != nc) return false;
  for (int i = 0; i < nc; i++)
    if (sum[i] != c[nc - 1 - i])
      return false;
  return true;
}

char s[1234567];

void output(int na, int nb, int nc) {
for (int i = 0; i < na; i++) printf("%c", s[i]);
      printf("+");
      for (int i = 0; i < nb; i++) printf("%c", s[na+i]);
      printf("=");
      for (int i = 0; i < nc; i++) printf("%c", s[na+nb+i]);
      printf("\n");
}

bool test(int na, int nb, int nc) {
  if (possible(s, na, s + na, nb, s + na + nb, nc)
      && check(s, na, s + na, nb, s + na + nb, nc)) {
    output(na, nb, nc);
    return true;
  }
  return false;
}

int main() {

  cin >> s;
  int n = strlen(s);
  if (n == 3 && s[0] == '0' && s[1] == '0' && s[2] == '0') {
    cout << "0+0=0" << endl;
    return 0;
  }

  for (int na = 1; na < n; na++) {
    int nb = (n - na) / 2;
    int nc = n - na - nb;
    if (test(na, nb, nc)) return 0;

    nc = na;
    nb = n - nc - na;
    if (nb > 0 && test(na, nb, nc)) return 0;

    nc = na + 1;
    nb = n - nc - na;
    if (nb > 0 && test(na, nb, nc)) return 0;
  }
  return 0;
}


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

char str[1000010];

int n;

struct work {
	int mod;
	int add(int a, int b) { return a+b >= mod ? a+b-mod : a+b; }
	int dec(int a, int b) { return a-b < 0 ? a-b+mod : a-b; }
	int pow(int a, int x) {
		int res = 1;
		for(; x; x >>= 1) {
			if(x&1) res = 1ll*res*a%mod;
			a = 1ll*a*a%mod;
		}
		return res;
	}
	int inv(int x) { return pow(x, mod-2); }
	int s[1000010], t[1000010], g[1000010];
	void init(int m) {
		mod = m;
		for(int i = 1; i <= n; i++) s[i] = (s[i-1]*10ll+str[i]-'0')%mod;
		t[0] = 1; int iv = inv(10); g[0] = 1;
		for(int i = 1; i <= n; i++) t[i] = 1ll*t[i-1]*iv%mod, g[i] = 1ll*g[i-1]*10%mod;
	}
	int v(int l, int r) {
		return 1ll*dec(s[r], 1ll*s[l-1]*g[r-l+1]%mod)%mod;
	}
} s1, s2, s3;

int main() {
	scanf("%s", str+1); n = strlen(str+1);
	if(str[1] == '0') {
		putchar(str[1]);
		putchar('+');
		for(int i = 2; i <= (n+1)/2; i++)
			putchar(str[i]);
		putchar('=');
		for(int i = (n+1)/2+1; i <= n; i++)
			putchar(str[i]);
		cout << endl;
		return 0;
	}
	s1.init(998244353);
	s2.init(int(1e9+7));
	s3.init(1004535809);
	for(int i = 1; i <= n; i++) {
		if(str[i] == '0') continue;
		int x1 = s1.v(i, n);
		int x2 = s2.v(i, n);
		int x3 = s3.v(i, n);
		int len = n-i+1;
		if(len+1 <= i-1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
		len--;
		if(len+1 <= i-1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
		len = n-i+1;
		len = i-len-1;
		if(len >= 1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
		len++;
		if(len >= 1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
	}
}


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

char str[1000010];

int n;

struct work {
	int mod;
	int add(int a, int b) { return a+b >= mod ? a+b-mod : a+b; }
	int dec(int a, int b) { return a-b < 0 ? a-b+mod : a-b; }
	int pow(int a, int x) {
		int res = 1;
		for(; x; x >>= 1) {
			if(x&1) res = 1ll*res*a%mod;
			a = 1ll*a*a%mod;
		}
		return res;
	}
	int inv(int x) { return pow(x, mod-2); }
	int s[1000010], t[1000010], g[1000010];
	void init(int m) {
		mod = m;
		for(int i = 1; i <= n; i++) s[i] = (s[i-1]*10ll+str[i]-'0')%mod;
		t[0] = 1; int iv = inv(10); g[0] = 1;
		for(int i = 1; i <= n; i++) t[i] = 1ll*t[i-1]*iv%mod, g[i] = 1ll*g[i-1]*10%mod;
	}
	int v(int l, int r) {
		return 1ll*dec(s[r], 1ll*s[l-1]*g[r-l+1]%mod)%mod;
	}
} s1, s2, s3;

int main() {
	scanf("%s", str+1); n = strlen(str+1);
	if(str[1] == '0') {
		putchar(str[1]);
		putchar('+');
		for(int i = 2; i <= (n+1)/2; i++)
			putchar(str[i]);
		putchar('=');
		for(int i = (n+1)/2+1; i <= n; i++)
			putchar(str[i]);
		cout << endl;
		return 0;
	}
	s1.init(998244353);
	s2.init(int(1e9+7));
	s3.init(1004535809);
	for(int i = 1; i <= n; i++) {
		if(str[i] == '0') {
			if(s1.v(1, i-1) == s1.v(i+1, n) && s2.v(1, i-1) == s2.v(i+1, n) && s3.v(1, i-1) == s3.v(i+1, n)) {
				for(int j = 1; j < i; j++)
					putchar(str[j]);
				putchar('+');
				putchar('0');
				putchar('=');
				for(int j = i+1; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
	}
	for(int i = 1; i <= n; i++) {
		if(str[i] == '0') continue;
		int x1 = s1.v(i, n);
		int x2 = s2.v(i, n);
		int x3 = s3.v(i, n);
		int len = n-i+1;
		if(len+1 <= i-1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
		len--;
		if(len+1 <= i-1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
		len = n-i+1;
		len = i-len-1;
		if(len >= 1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
		len++;
		if(len >= 1 && str[len+1] != '0') {
			int a1 = s1.v(1, len);
			int a2 = s2.v(1, len);
			int a3 = s3.v(1, len);
			int b1 = s1.v(len+1, i-1);
			int b2 = s2.v(len+1, i-1);
			int b3 = s3.v(len+1, i-1);
			if(s1.add(a1, b1) == x1 && s2.add(a2, b2) == x2 && s3.add(a3, b3) == x3) {
				for(int j = 1; j <= len; j++)
					putchar(str[j]);
				putchar('+');
				for(int j = len+1; j <= i-1; j++)
					putchar(str[j]);
				putchar('=');
				for(int j = i; j <= n; j++)
					putchar(str[j]);
				cout << endl;
				return 0;
			}
		}
	}
}


#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<time.h>
#include<vector>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1e6+10;
const int mod1=1e9+7;
const int mod2=998244353;
const int inf=0x3f3f3f3f;

int n,m,a[N];
LL x,y,z,inv1[N],inv2[N],sum1[N],sum2[N];

inline void Init() {
	register char c=getchar();
	for (;c<'0'||c>'9';) c=getchar();
	for (;c>='0'&&c<='9';c=getchar()) a[++n]=c-'0';
	inv1[1]=700000005;
	inv2[1]=299473306;
	for (int i=2;i<=n;i++) {
		inv1[i]=inv1[i-1]*inv1[1]%mod1;
		inv2[i]=inv2[i-1]*inv2[1]%mod2;
	}
	LL t1=1,t2=1;
	for (int i=n;i>=1;i--) {
		sum1[i]=(sum1[i+1]+t1*a[i])%mod1;
		sum2[i]=(sum2[i+1]+t2*a[i])%mod2;
		t1=t1*10%mod1;
		t2=t2*10%mod2;
	}
}

inline void Check(int l,int r) {
	if (l<=0||r<=l) return;
	LL x1=sum1[r+1],x2=sum2[r+1];
	LL y1=(sum1[l+1]-sum1[r+1]+mod1)*inv1[n-r]%mod1,y2=(sum2[l+1]-sum2[r+1]+mod2)*inv2[n-r]%mod2;
	LL z1=(sum1[1]-sum1[l+1]+mod1)*inv1[n-l]%mod1,z2=(sum2[1]-sum2[l+1]+mod2)*inv2[n-l]%mod2;
	if ((!a[1]&&z1)||(!a[l+1]&&y1)||(!a[r+1]&&x1))return;
	if ((z1+y1)%mod1==x1)
		if ((z2+y2)%mod2==x2) {
			for (int i=1;i<=l;i++) putchar(a[i]+'0');
			putchar('+');
			for (int i=l+1;i<=r;i++) putchar(a[i]+'0');
			putchar('=');
			for (int i=r+1;i<=n;i++) putchar(a[i]+'0');
			exit(0);
		}
}

inline void Work() {
	for (int i=n/3;i<=n>>1;i++) {
		Check(i,n-i);
		Check(i-1,n-i);
		Check(n-i-i,n-i);
		Check(n-i-i+1,n-i);
	}
}

int main() {
	Init();
	Work();
	return 0;
}


#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<time.h>
#include<vector>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1e6+10;
const int mod1=1e9+7;
const int mod2=998244353;
const int inf=0x3f3f3f3f;

int n,m,a[N];
LL x,y,z,inv1[N],inv2[N],sum1[N],sum2[N];

inline void Init() {
	register char c=getchar();
	for (;c<'0'||c>'9';) c=getchar();
	for (;c>='0'&&c<='9';c=getchar()) a[++n]=c-'0';
	inv1[1]=700000005;
	inv2[1]=299473306;
	for (int i=2;i<=n;i++) {
		inv1[i]=inv1[i-1]*inv1[1]%mod1;
		inv2[i]=inv2[i-1]*inv2[1]%mod2;
	}
	LL t1=1,t2=1;
	for (int i=n;i>=1;i--) {
		sum1[i]=(sum1[i+1]+t1*a[i])%mod1;
		sum2[i]=(sum2[i+1]+t2*a[i])%mod2;
		t1=t1*10%mod1;
		t2=t2*10%mod2;
	}
}

inline void Check(int l,int r) {
	if (l<=0||r<=l) return;
	if (!a[1]||!a[l+1]||!a[r+1]) return;
	LL x1=sum1[r+1],x2=sum2[r+1];
	LL y1=(sum1[l+1]-sum1[r+1]+mod1)*inv1[n-r]%mod1,y2=(sum2[l+1]-sum2[r+1]+mod2)*inv2[n-r]%mod2;
	LL z1=(sum1[1]-sum1[l+1]+mod1)*inv1[n-l]%mod1,z2=(sum2[1]-sum2[l+1]+mod2)*inv2[n-l]%mod2;
	if ((z1+y1)%mod1==x1)
		if ((z2+y2)%mod2==x2) {
			for (int i=1;i<=l;i++) putchar(a[i]+'0');
			putchar('+');
			for (int i=l+1;i<=r;i++) putchar(a[i]+'0');
			putchar('=');
			for (int i=r+1;i<=n;i++) putchar(a[i]+'0');
			exit(0);
		}
}

inline void Work() {
	for (int i=n/3;i<=n>>1;i++) {
		Check(i,n-i);
		Check(i-1,n-i);
		Check(n-i-i,n-i);
		Check(n-i-i+1,n-i);
	}
}

int main() {
	Init();
	Work();
	return 0;
}


#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<time.h>
#include<vector>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1e6+10;
const int mod1=1e9+7;
const int mod2=998244353;
const int inf=0x3f3f3f3f;

int n,m,a[N];
LL x,y,z,inv1[N],inv2[N],sum1[N],sum2[N];

inline void Init() {
	register char c=getchar();
	for (;c<'0'||c>'9';) c=getchar();
	for (;c>='0'&&c<='9';c=getchar()) a[++n]=c-'0';
	inv1[1]=700000005;
	inv2[1]=299473306;
	for (int i=2;i<=n;i++) {
		inv1[i]=inv1[i-1]*inv1[1]%mod1;
		inv2[i]=inv2[i-1]*inv2[1]%mod2;
	}
	LL t1=1,t2=1;
	for (int i=n;i>=1;i--) {
		sum1[i]=(sum1[i+1]+t1*a[i])%mod1;
		sum2[i]=(sum2[i+1]+t2*a[i])%mod2;
		t1=t1*10%mod1;
		t2=t2*10%mod2;
	}
}

inline void Check(int l,int r) {
	if (l<=0||r<=l) return;
	LL x1=sum1[r+1],x2=sum2[r+1];
	LL y1=(sum1[l+1]-sum1[r+1]+mod1)*inv1[n-r]%mod1,y2=(sum2[l+1]-sum2[r+1]+mod2)*inv2[n-r]%mod2;
	LL z1=(sum1[1]-sum1[l+1]+mod1)*inv1[n-l]%mod1,z2=(sum2[1]-sum2[l+1]+mod2)*inv2[n-l]%mod2;
	if ((z1+y1)%mod1==x1)
		if ((z2+y2)%mod2==x2) {
			for (int i=1;i<=l;i++) putchar(a[i]+'0');
			putchar('+');
			for (int i=l+1;i<=r;i++) putchar(a[i]+'0');
			putchar('=');
			for (int i=r+1;i<=n;i++) putchar(a[i]+'0');
			exit(0);
		}
}

inline void Work() {
	for (int i=n/3;i<=n>>1;i++) {
		Check(i,n-i);
		Check(i-1,n-i);
		Check(n-i-i,n-i);
		Check(n-i-i+1,n-i);
	}
}

int main() {
	Init();
	Work();
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
const int sed=10,mod=1e9+7;
char a[1000005];
int s[1000005],l;
int bas[1000005],inv[1000005];
int sum[1000005],len1,len2,len3,pos1,pos2,pos3;
int qmi(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b%2)ans=1ll*ans*a%mod;
        a=1ll*a*a%mod;
        b/=2;
    }
    return ans;
}
bool check(int pos1,int pos2,int pos3)
{
    int start1=pos2-1,start2=pos3-1,start3=l-1;
    int now=0;
    while(start3>=pos3)
    {
        int s1=start1<pos1?0:s[start1];
        int s2=start2<pos2?0:s[start2];
        int s3=s[start3];
        if((s1+s2+now)%10!=s3)return false;
        now=(s1+s2+now)/10;
        start1--;start2--;start3--;
    }
    if(now==0)
    {
        for(int i=pos1;i<pos2;i++)
            printf("%c",a[i]);
        printf("+");
        for(int i=pos2;i<pos3;i++)
            printf("%c",a[i]);
        printf("=");
        for(int i=pos3;i<l;i++)
            printf("%c",a[i]);
        printf("\n");
        return true;
    }
    return false;
}
bool judge(int pos1,int pos2,int pos3)
{
    if(pos1<0||pos2<0||(pos2-pos1>1&&!s[pos1])||(pos3-pos2>1&&!s[pos2])||(l-pos3>1&&!s[pos3]))return 0;
    int s1=1ll*((sum[pos1]-sum[pos2])%mod+mod)*inv[l-pos2]%mod;
    int s2=1ll*((sum[pos2]-sum[pos3])%mod+mod)*inv[l-pos3]%mod;
    int s3=sum[pos3];
    if((s1+s2)%mod==s3&&check(pos1,pos2,pos3))return 1;
    return 0;
}
int main()
{
    scanf("%s",a);
    l=strlen(a);
    bas[0]=1;
    for(int i=1;i<l;i++)
        bas[i]=1ll*bas[i-1]*sed%mod;
    for(int i=0;i<l;i++)
        inv[i]=qmi(bas[i],mod-2);
    for(int i=0;i<l;i++)
        s[i]=a[i]-'0';
    sum[l]=0;
    for(int i=l-1;i>=0;i--)
        sum[i]=(sum[i+1]+1ll*s[i]*bas[l-i-1])%mod;
    for(int i=0;i<l;i++)
    {
        len3=l-i;pos3=i;
        len2=len3;pos2=pos3-len2;
        len1=l-len2-len3;pos1=pos2-len1;
        if(len1>=1&&len2>=1&&len3>=1&&judge(pos1,pos2,pos3))return 0;

        len2=len3-1;pos2=pos3-len2;
        len1=l-len2-len3;pos1=pos2-len1;
        if(len1>=1&&len2>=1&&len3>=1&&judge(pos1,pos2,pos3))return 0;

        len2=l-len3*2;pos2=pos3-len2;
        len1=len3;pos1=pos2-len1;
        if(len1>=1&&len2>=1&&len3>=1&&judge(pos1,pos2,pos3))return 0;

        len2=l-2*len3+1;pos2=pos3-len2;
        len1=len3-1;pos1=pos2-len1;
        if(len1>=1&&len2>=1&&len3>=1&&judge(pos1,pos2,pos3))return 0;
    }
}


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<iostream>
using namespace std;

int n;
#define maxn 1000011
char s[maxn];
#define LL long long
LL hh[maxn],hhh[maxn],bin[maxn],binbin[maxn];
const int mod=1e9+7;
//yong 11 hash
LL gethash(int x,int y) {return hh[y]-hh[x-1]*bin[y-x+1];}
LL gethhh(int x,int y) {return ((hhh[y]-hhh[x-1]*binbin[y-x+1])%mod+mod)%mod;}
void getans(int a,int b,int c)
{
	for (int i=a;i<b;i++) putchar(s[i]);
	putchar('+');
	for (int i=b;i<c;i++) putchar(s[i]);
	putchar('=');
	for (int i=c;i<=n;i++) putchar(s[i]);
}
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	hh[0]=0;bin[0]=1;hhh[0]=0;binbin[0]=1;
	for (int i=1;i<=n;i++)
		hh[i]=(hh[i-1]*10+s[i]-'0'),bin[i]=bin[i-1]*10,
		hhh[i]=(hhh[i-1]*10+s[i]-'0')%mod,binbin[i]=binbin[i-1]*10%mod;
	if (s[1]=='0') {getans(1,2,2+(n/2));return 0;}
	for (int i=max((n+3)/2,1);i<=n;i++) if (s[i]!='0')
	{

		LL now=gethash(i,n),nnn=gethhh(i,n);
		int len=n-i+1;
		if (len<i && (s[len]!='0' || (s[len]=='0' && i-1==len))
		&& gethash(1,len-1)+gethash(len,i-1)==now && (gethhh(1,len-1)+gethhh(len,i-1))%mod==nnn)
		{getans(1,len,i);break;}
		if (len<i-1 && (s[len+1]!='0' || (s[len+1]=='0' && i-1==len+1))
		&& gethash(1,len)+gethash(len+1,i-1)==now && (gethhh(1,len)+gethhh(len+1,i-1))%mod==nnn)
		{getans(1,len+1,i);break;}
		if (i-len>=1 && (s[i-len+1]!='0' || (s[i-len+1]=='0' && i-1==i-len+1))
		&& gethash(1,i-len)+gethash(i-len+1,i-1)==now && (gethhh(1,i-len)+gethhh(i-len+1,i-1))%mod==nnn)
		{getans(1,i-len+1,i);break;}
		if (i-len-1>=1 && (s[i-len]!='0' || (s[i-len]=='0' && i-1==i-len))
		&& gethash(1,i-len-1)+gethash(i-len,i-1)==now && (gethhh(1,i-len-1)+gethhh(i-len,i-1))%mod==nnn)
		{getans(1,i-len,i);break;}
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<iostream>
using namespace std;

int n;
#define maxn 1000011
char s[maxn];
#define LL long long
LL hh[maxn],bin[maxn];
//yong 11 hash
LL gethash(int x,int y) {return hh[y]-hh[x-1]*bin[y-x+1];}
void getans(int a,int b,int c)
{
	for (int i=a;i<b;i++) putchar(s[i]);
	putchar('+');
	for (int i=b;i<c;i++) putchar(s[i]);
	putchar('=');
	for (int i=c;i<=n;i++) putchar(s[i]);
}
int main()
{

	scanf("%s",s+1);n=strlen(s+1);
	hh[0]=0;bin[0]=1;for (int i=1;i<=n;i++) hh[i]=(hh[i-1]*10+s[i]-'0'),bin[i]=bin[i-1]*10;
	if (s[1]=='0') {getans(1,2,2+(n/2));return 0;}
	for (int i=max((n+3)/2,1);i<=n;i++) if (s[i]!='0')
	{
		LL now=gethash(i,n);
		int len=n-i+1;
		if (len<i && (s[len]!='0' || (s[len]=='0' && i-1==len))
		&& gethash(1,len-1)+gethash(len,i-1)==now) {getans(1,len,i);break;}
		if (len<i-1 && (s[len+1]!='0' || (s[len+1]=='0' && i-1==len+1))
		&& gethash(1,len)+gethash(len+1,i-1)==now) {getans(1,len+1,i);break;}
		if (i-len>=1 && (s[i-len+1]!='0' || (s[i-len+1]=='0' && i-1==i-len+1))
		&& gethash(1,i-len)+gethash(i-len+1,i-1)==now) {getans(1,i-len+1,i);break;}
		if (i-len-1>=1 && (s[i-len]!='0' || (s[i-len]=='0' && i-1==i-len))
		&& gethash(1,i-len-1)+gethash(i-len,i-1)==now) {getans(1,i-len,i);break;}
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<iostream>
using namespace std;

int n;
#define maxn 1000011
char s[maxn];
#define LL long long
LL hh[maxn],bin[maxn];
//yong 11 hash
LL gethash(int x,int y) {return hh[y]-hh[x-1]*bin[y-x+1];}
void getans(int a,int b,int c)
{
	for (int i=a;i<b;i++) putchar(s[i]);
	putchar('+');
	for (int i=b;i<c;i++) putchar(s[i]);
	putchar('=');
	for (int i=c;i<=n;i++) putchar(s[i]);
}
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	hh[0]=0;bin[0]=1;for (int i=1;i<=n;i++) hh[i]=(hh[i-1]*10+s[i]-'0'),bin[i]=bin[i-1]*10;
	if (s[1]=='0') {getans(1,2,2+(n/2));return 0;}
	for (int i=max((n+3)/2,1);i<=n;i++) if (s[i]!='0')
	{
		LL now=gethash(i,n);
		int len=n-i+1;
		if (len<i && (s[len]!='0' || (s[len]=='0' && i-1==len))
		&& gethash(1,len-1)+gethash(len,i-1)==now) {getans(1,len,i);break;}
		if (len<i-1 && (s[len+1]!='0' || (s[len+1]=='0' && i-1==len+1))
		&& gethash(1,len)+gethash(len+1,i-1)==now) {getans(1,len+1,i);break;}
		if (i-len>=1 && (s[i-len+1]!='0' || (s[i-len+1]=='0' && i-1==i-len+1))
		&& gethash(1,i-len)+gethash(i-len+1,i-1)==now) {getans(1,i-len+1,i);break;}
		if (i-len-1>=1 && (s[i-len]!='0' || (s[i-len]=='0' && i-1==i-len))
		&& gethash(1,i-len-1)+gethash(i-len,i-1)==now) {getans(1,i-len,i);break;}
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<iostream>
using namespace std;

int n;
#define maxn 1000011
char s[maxn];
#define LL long long
LL hh[maxn],hhh[maxn],bin[maxn],binbin[maxn];
const int mod=1e9+7;
//yong 11 hash
LL gethash(int x,int y) {return hh[y]-hh[x-1]*bin[y-x+1];}
LL gethhh(int x,int y) {return ((hhh[y]-hhh[x-1]*binbin[y-x+1])%mod+mod)%mod;}
void getans(int a,int b,int c)
{
	for (int i=a;i<b;i++) putchar(s[i]);
	putchar('+');
	for (int i=b;i<c;i++) putchar(s[i]);
	putchar('=');
	for (int i=c;i<=n;i++) putchar(s[i]);
}
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	hh[0]=0;bin[0]=1;hhh[0]=0;binbin[0]=1;
	for (int i=1;i<=n;i++)
		hh[i]=(hh[i-1]*10+s[i]-'0'),bin[i]=bin[i-1]*10,
		hhh[i]=(hhh[i-1]*10+s[i]-'0')%mod,binbin[i]=binbin[i-1]*10%mod;
	if (s[1]=='0') {getans(1,2,2+(n/2));return 0;}
	for (int i=max((n+3)/2,1);i<=n;i++) if (s[i]!='0')
	{
		LL now=gethash(i,n),nnn=gethhh(i,n);
		int len=n-i+1;
		if (len<i && (s[len]!='0' || (s[len]=='0' && i-1==len))
		&& gethash(1,len-1)+gethash(len,i-1)==now && (gethhh(1,len-1)+gethhh(len,i-1))%mod==nnn)
		{getans(1,len,i);break;}
		if (len<i-1 && (s[len+1]!='0' || (s[len+1]=='0' && i-1==len+1))
		&& gethash(1,len)+gethash(len+1,i-1)==now && (gethhh(1,len)+gethhh(len+1,i-1))%mod==nnn)
		{getans(1,len+1,i);break;}
		if (i-len>=1 && (s[i-len+1]!='0' || (s[i-len+1]=='0' && i-1==i-len+1))
		&& gethash(1,i-len)+gethash(i-len+1,i-1)==now && (gethhh(1,i-len)+gethhh(i-len+1,i-1))%mod==nnn)
		{getans(1,i-len+1,i);break;}
		if (i-len-1>=1 && (s[i-len]!='0' || (s[i-len]=='0' && i-1==i-len))
		&& gethash(1,i-len-1)+gethash(i-len,i-1)==now && (gethhh(1,i-len-1)+gethhh(i-len,i-1))%mod==nnn)
		{getans(1,i-len,i);break;}
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<iostream>
using namespace std;

int n;
#define maxn 1000011
char s[maxn];
#define LL long long
LL hh[maxn],bin[maxn];
//yong 11 hash
LL gethash(int x,int y) {return hh[y]-hh[x-1]*bin[y-x+1];}
void getans(int a,int b,int c)
{
	for (int i=a;i<b;i++) putchar(s[i]);
	putchar('+');
	for (int i=b;i<c;i++) putchar(s[i]);
	putchar('=');
	for (int i=c;i<=n;i++) putchar(s[i]);
}
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	hh[0]=0;bin[0]=1;for (int i=1;i<=n;i++) hh[i]=(hh[i-1]*10+s[i]-'0'),bin[i]=bin[i-1]*10;
	if (s[1]=='0') {getans(1,2,2+(n/2));return 0;}
	for (int i=max((n+3)/2,1);i<=n;i++) if (s[i]!='0')
	{
		LL now=gethash(i,n);
		int len=n-i+1;
		if (len<i && s[len]!='0' && gethash(1,len-1)+gethash(len,i-1)==now) {getans(1,len,i);break;}
		if (len<i-1 && s[len+1]!='0' && gethash(1,len)+gethash(len+1,i-1)==now) {getans(1,len+1,i);break;}
		if (i-len>=1 && s[i-len+1]!='0' && gethash(1,i-len)+gethash(i-len+1,i-1)==now) {getans(1,i-len+1,i);break;}
		if (i-len+1>=1 && s[i-len+2]!='0' && gethash(1,i-len+1)+gethash(i-len+2,i-1)==now) {getans(1,i-len+2,i);break;}
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<iostream>
using namespace std;

int n;
#define maxn 1000011
char s[maxn];
#define LL long long
LL hh[maxn],bin[maxn];
//yong 11 hash
LL gethash(int x,int y) {return hh[y]-hh[x-1]*bin[y-x+1];}
void getans(int a,int b,int c)
{
	for (int i=a;i<b;i++) putchar(s[i]);
	putchar('+');
	for (int i=b;i<c;i++) putchar(s[i]);
	putchar('=');
	for (int i=c;i<=n;i++) putchar(s[i]);
}
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	hh[0]=0;bin[0]=1;for (int i=1;i<=n;i++) hh[i]=(hh[i-1]*10+s[i]-'0'),bin[i]=bin[i-1]*10;
	if (s[1]=='0') {getans(1,2,2+(n/2));return 0;}
	for (int i=max((n+3)/2,1);i<=n;i++) if (s[i]!='0')
	{
		LL now=gethash(i,n);
		int len=n-i+1;
//		if (len==57) cout<<i-len-1<<' '<<i-len<<endl;
		if (len<i && (s[len]!='0' || (s[len]=='0' && i-1==len))
		&& gethash(1,len-1)+gethash(len,i-1)==now) {getans(1,len,i);break;}
		if (len<i-1 && (s[len+1]!='0' || (s[len+1]=='0' && i-1==len+1))
		&& gethash(1,len)+gethash(len+1,i-1)==now) {getans(1,len+1,i);break;}
		if (i-len>=1 && (s[i-len+1]!='0' || (s[i-len+1]=='0' && i-1==i-len+1))
		&& gethash(1,i-len)+gethash(i-len+1,i-1)==now) {getans(1,i-len+1,i);break;}
		if (i-len-1>=1 && (s[i-len]!='0' || (s[i-len]=='0' && i-1==i-len))
		&& gethash(1,i-len-1)+gethash(i-len,i-1)==now) {getans(1,i-len,i);break;}
	}
	return 0;
}


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
//#include<math.h>
//#include<queue>
//#include<iostream>
using namespace std;

int n;
#define maxn 1000011
char s[maxn];
#define LL long long
LL hh[maxn],bin[maxn];
//yong 11 hash
LL gethash(int x,int y) {return hh[y]-hh[x-1]*bin[y-x+1];}
void getans(int a,int b,int c)
{
	for (int i=a;i<b;i++) putchar(s[i]);
	putchar('+');
	for (int i=b;i<c;i++) putchar(s[i]);
	putchar('=');
	for (int i=c;i<=n;i++) putchar(s[i]);
}
int main()
{
	scanf("%s",s+1);n=strlen(s+1);
	hh[0]=0;bin[0]=1;for (int i=1;i<=n;i++) hh[i]=(hh[i-1]*10+s[i]-'0'),bin[i]=bin[i-1]*10;
	if (s[1]=='0') {getans(1,2,2+(n/2));return 0;}
	for (int i=max((n+3)/2,1);i<=n;i++) if (s[i]!='0')
	{
		LL now=gethash(i,n);
		int len=n-i+1;
		if (len<i && (s[len]!='0' || (s[len]=='0' && i-1==len))
		&& gethash(1,len-1)+gethash(len,i-1)==now) {getans(1,len,i);break;}
		if (len<i-1 && (s[len+1]!='0' || (s[len+1]=='0' && i-1==len+1))
		&& gethash(1,len)+gethash(len+1,i-1)==now) {getans(1,len+1,i);break;}
		if (i-len>=1 && (s[i-len+1]!='0' || (s[i-len+1]=='0' && i-1==i-len+1))
		&& gethash(1,i-len)+gethash(i-len+1,i-1)==now) {getans(1,i-len+1,i);break;}
		if (i-len+1>=1 && (s[i-len+2]!='0' || (s[i-len+2]=='0' && i-1==i-len+2))
		&& gethash(1,i-len+1)+gethash(i-len+2,i-1)==now) {getans(1,i-len+2,i);break;}
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f,maxn = 1e6 + 10,mod = 1e9 + 7;
typedef long long ll;
char s[maxn];
int b[maxn],sumh[maxn],n,INV[maxn];

int fpow(int x,int n){
    int res = 1;
    while(n){
        if(n&1) res = (1ll * res * x) % mod;
        x = 1ll * x * x % mod;
        n >>= 1;
    }
    return res;
}
int inv(int x){
    return fpow(x,mod - 2);
}

bool ok(int l,int r){
    int k1 = l - 1,k2 = r - l,k3 = n - r + 1;
    if(max(k1,k2) > k3) return false;
    if(n - r + 1 > 1&&s[r] == '0') return false;
    if(r - l > 1&&s[l] == '0') return false;
    int a = 1ll * sumh[l - 1] * INV[n - l + 1] % mod;
    int b = 1ll * ((sumh[r - 1] - sumh[l - 1] + mod) % mod) * INV[ n - r + 1] % mod;
    int c = 1ll * (sumh[n] - sumh[r - 1] + mod) % mod;
    //printf("%d %d %d\n",a,b,c);
    return (a + b) % mod == c;
}

void Print(int k1,int k2){
    for(int i = 1;i < k1;i++) printf("%c",s[i]);printf("+");
    for(int i = k1;i < k2;i++) printf("%c",s[i]);printf("=");
    for(int i = k2;i <= n;i++) printf("%c",s[i]);
}

int main(){
    int x = 10;
    scanf("%s",s + 1);
    n = strlen(s + 1);
    b[0] = 1;

    for(int i = 1;i <= n;i++){
        b[i] = 1ll * b[i - 1] * 10 % mod;
        INV[i] = inv(b[i]);
    }
    for(int i = 1;i <= n;i++){
        sumh[i] = (1ll * sumh[i - 1] + 1ll * (s[i] - '0') * b[n-i]) % mod;
    }
    //for(int i = 1;i <= n;i++) printf("%d ",sumh[i]);printf("\n");
    for(int i = 1;i <= n/2;i++){
        if(i * 2 >= n) continue;
        int k1 = i + 1,k2,len = n - i;
        k2 = n - i + 1;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
        k2--;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
        k2 = n - len / 2 + 1;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
        k2--;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
    }
    return 0;
}


#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f,maxn = 1e6 + 10,mod = 1e9 + 7;
typedef long long ll;
char s[maxn];
int b[maxn],sumh[maxn],n,INV[maxn];

int fpow(int x,int n){
    int res = 1;
    while(n){
        if(n&1) res = (1ll * res * x) % mod;
        x = 1ll * x * x % mod;
        n >>= 1;
    }
    return res;
}
int inv(int x){
    return fpow(x,mod - 2);
}

bool ok(int l,int r){
    //printf("%d %d\n",l,r);
    if(n - r + 1 > 1&&s[r] == '0') return false;
    if(r - l > 1&&s[l] == '0') return false;
    int a = 1ll * sumh[l - 1] * INV[n - l + 1] % mod;
    int b = 1ll * ((sumh[r - 1] - sumh[l - 1] + mod) % mod) * INV[ n - r + 1] % mod;
    int c = 1ll * (sumh[n] - sumh[r - 1] + mod) % mod;
    //printf("%d %d %d\n",a,b,c);
    return (a + b) % mod == c;
}

void Print(int k1,int k2){
    for(int i = 1;i < k1;i++) printf("%c",s[i]);printf("+");
    for(int i = k1;i < k2;i++) printf("%c",s[i]);printf("=");
    for(int i = k2;i <= n;i++) printf("%c",s[i]);
}

int main(){
    int x = 10;
    scanf("%s",s + 1);
    n = strlen(s + 1);
    b[0] = 1;

    for(int i = 1;i <= n;i++){
        b[i] = 1ll * b[i - 1] * 10 % mod;
        INV[i] = inv(b[i]);
    }
    for(int i = 1;i <= n;i++){
        sumh[i] = (1ll * sumh[i - 1] + 1ll * (s[i] - '0') * b[n-i]) % mod;
    }
    //for(int i = 1;i <= n;i++) printf("%d ",sumh[i]);printf("\n");
    for(int i = 1;i <= n/2;i++){
        if(i * 2 >= n) continue;
        int k1 = i + 1,k2,len = n - i;
        k2 = n - i + 1;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
        k2--;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
        k2 = n - len / 2 + 1;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
        k2--;
        if(ok(k1,k2)){
            Print(k1,k2);
            return 0;
        }
    }
    return 0;
}


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

const int MAXN=1000100;
const int P=1000000007;

struct node{
	int l,r;
	long long val;
	node *lson,*rson;
}pool[10*MAXN],*root;

int n,top=-1;
long long exp10[MAXN];
char str[MAXN];

inline long long HASH(long long x,long long y,int len){return ((long long)(x*exp10[len])%P+y)%P;}

inline void update(node *now){now->val=HASH(now->lson->val,now->rson->val,now->rson->r-now->rson->l+1);}

void B_T(node *now,int l,int r){
	now->l=l;now->r=r;
	if(l==r){
		now->val=str[l]-'0';
		return ;
	}
	now->lson=&pool[++top];
	now->rson=&pool[++top];
	B_T(now->lson,l,(l+r)/2);
	B_T(now->rson,(l+r)/2+1,r);
	update(now);
}

long long query(node *now,int l,int r){
	if(now->l==l && now->r==r) return now->val;
	int ll=now->lson->l,rr=now->rson->r;
	int lr=(ll+rr)/2,rl=lr+1;
	if(r<rl) return query(now->lson,l,r);
	if(l>lr) return query(now->rson,l,r);
	return HASH(query(now->lson,l,lr),query(now->rson,rl,r),r-rl+1);
}

inline void display(int l,int r){
	for(int i=1;i<=l;i++) printf("%c",str[i]);
	printf("+");
	for(int i=l+1;i<=r;i++) printf("%c",str[i]);
	printf("=");
	for(int i=r+1;i<=n;i++) printf("%c",str[i]);
}

void init(){
	long long x,y,z;
	scanf("%s",str+1);
	n=strlen(str+1);
	exp10[0]=1;
	for(int i=1;i<=n;i++) exp10[i]=(exp10[i-1]*10)%P;
	root=&pool[++top];
	B_T(root,1,n);
	for(int i=(n+1)/3;i<=(n-1)/2;i++){
		//printf("%d\n",i);
		//i,(),i
		x=query(root,1,i),y=query(root,i+1,n-i),z=query(root,n-i+1,n);
		//printf("%lld,%lld,%lld\n",x,y,z);
		if((x+y)%P==z){
			display(i,n-i);
			break;
		}
		//i,(),i+1
		x=query(root,1,i),y=query(root,i+1,n-i-1),z=query(root,n-i,n);
		//printf("%lld,%lld,%lld\n",x,y,z);
		if((x+y)%P==z){
			display(i,n-i-1);
			break;
		}
		//(),i,i
		x=query(root,1,n-2*i),y=query(root,n-2*i+1,n-i),z=query(root,n-i+1,n);
		//printf("%lld,%lld,%lld\n",x,y,z);
		if((x+y)%P==z){
			display(n-2*i,n-i);
			break;
		}
		//(),i,i+1
		x=query(root,1,n-2*i-1),y=query(root,n-2*i,n-i-1),z=query(root,n-i,n);
		//printf("%lld,%lld,%lld\n",x,y,z);
		if((x+y)%P==z){
			display(n-2*i-1,n-i-1);
			break;
		}
	}
}

int main(int argc, char** argv) {
	init();
	return 0;
}


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

const int MAXN=1000100;
const int P=1000000007;

struct node{
	int l,r;
	long long val;
	node *lson,*rson;
}pool[10*MAXN],*root;

int n,top=-1;
long long exp10[MAXN];
char str[MAXN];

inline long long HASH(long long x,long long y,int len){return ((long long)(x*exp10[len])%P+y)%P;}

inline void update(node *now){now->val=HASH(now->lson->val,now->rson->val,now->rson->r-now->rson->l+1);}

void B_T(node *now,int l,int r){
	now->l=l;now->r=r;
	if(l==r){
		now->val=str[l]-'0';
		return ;
	}
	now->lson=&pool[++top];
	now->rson=&pool[++top];
	B_T(now->lson,l,(l+r)/2);
	B_T(now->rson,(l+r)/2+1,r);
	update(now);
}

long long query(node *now,int l,int r){
	if(now->l==l && now->r==r) return now->val;
	int ll=now->lson->l,rr=now->rson->r;
	int lr=(ll+rr)/2,rl=lr+1;
	if(r<rl) return query(now->lson,l,r);
	if(l>lr) return query(now->rson,l,r);
	return HASH(query(now->lson,l,lr),query(now->rson,rl,r),r-rl+1);
}

inline void display(int l,int r){
	for(int i=1;i<=l;i++) printf("%c",str[i]);
	printf("+");
	for(int i=l+1;i<=r;i++) printf("%c",str[i]);
	printf("=");
	for(int i=r+1;i<=n;i++) printf("%c",str[i]);
}

inline bool check(int l,int r){
	if(r<l) return false;
	if(r==l) return true;
	if(str[l]=='0') return false;
	return true;
}

void init(){
	long long x,y,z;
	scanf("%s",str+1);
	n=strlen(str+1);
	exp10[0]=1;
	for(int i=1;i<=n;i++) exp10[i]=(exp10[i-1]*10)%P;
	root=&pool[++top];
	B_T(root,1,n);
	for(int i=n/3;i<=n/2;i++){
		if(check(1,i)==true && check(i+1,n-i)==true && check(n-i+1,n)==true){
			x=query(root,1,i),y=query(root,i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i);
				break;
			}
		}
		if(check(1,i)==true && check(i+1,n-i-1)==true && check(n-i,n)==true){
			x=query(root,1,i),y=query(root,i+1,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i-1);
				break;
			}
		}
		if(check(1,n-2*i)==true && check(n-2*i+1,n-i)==true && check(n-i+1,n)==true){
			x=query(root,1,n-2*i),y=query(root,n-2*i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i,n-i);
				break;
			}
		}
		if(check(1,n-2*i-1)==true && check(n-2*i,n-i-1)==true && check(n-i,n)==true){
			x=query(root,1,n-2*i-1),y=query(root,n-2*i,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i-1,n-i-1);
				break;
			}
		}
	}
}

int main(int argc, char** argv) {
	init();
	return 0;
}


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

const int MAXN=1000100;
const int P=1000000007;

struct node{
	int l,r;
	long long val;
	node *lson,*rson;
}pool[10*MAXN],*root;

int n,top=-1;
long long exp10[MAXN];
char str[MAXN];

inline long long HASH(long long x,long long y,int len){return ((long long)(x*exp10[len])%P+y)%P;}

inline void update(node *now){now->val=HASH(now->lson->val,now->rson->val,now->rson->r-now->rson->l+1);}

void B_T(node *now,int l,int r){
	now->l=l;now->r=r;
	if(l==r){
		now->val=str[l]-'0';
		return ;
	}
	now->lson=&pool[++top];
	now->rson=&pool[++top];
	B_T(now->lson,l,(l+r)/2);
	B_T(now->rson,(l+r)/2+1,r);
	update(now);
}

long long query(node *now,int l,int r){
	if(now->l==l && now->r==r) return now->val;
	int ll=now->lson->l,rr=now->rson->r;
	int lr=(ll+rr)/2,rl=lr+1;
	if(r<rl) return query(now->lson,l,r);
	if(l>lr) return query(now->rson,l,r);
	return HASH(query(now->lson,l,lr),query(now->rson,rl,r),r-rl+1);
}

inline void display(int l,int r){
	for(int i=1;i<=l;i++) printf("%c",str[i]);
	printf("+");
	for(int i=l+1;i<=r;i++) printf("%c",str[i]);
	printf("=");
	for(int i=r+1;i<=n;i++) printf("%c",str[i]);
}

inline bool check(int l,int r){
	if(r==l) return true;
	if(str[l]=='0') return false;
	return true;
}

void init(){
	long long x,y,z;
	scanf("%s",str+1);
	n=strlen(str+1);
	exp10[0]=1;
	for(int i=1;i<=n;i++) exp10[i]=(exp10[i-1]*10)%P;
	root=&pool[++top];
	B_T(root,1,n);
	for(int i=n/3;i<=n/2;i++){
		if(check(1,i)==true && check(i+1,n-i)==true && check(n-i+1,n)==true){
			x=query(root,1,i),y=query(root,i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i);
				break;
			}
		}
		if(check(1,i)==true && check(i+1,n-i-1)==true && check(n-i,n)==true){
			x=query(root,1,i),y=query(root,i+1,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i-1);
				break;
			}
		}
		if(check(1,n-2*i)==true && check(n-2*i+1,n-i)==true && check(n-i+1,n)==true){
			x=query(root,1,n-2*i),y=query(root,n-2*i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i,n-i);
				break;
			}
		}
		if(check(1,n-2*i-1)==true && check(n-2*i,n-i-1)==true && check(n-i,n)==true){
			x=query(root,1,n-2*i-1),y=query(root,n-2*i,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i-1,n-i-1);
				break;
			}
		}
	}
}

int main(int argc, char** argv) {
	init();
	return 0;
}


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

const int MAXN=1000100;
const int P=1000000007;

struct node{
	int l,r;
	long long val;
	node *lson,*rson;
}pool[10*MAXN],*root;

int n,top=-1;
long long exp10[MAXN];
char str[MAXN];

inline long long HASH(long long x,long long y,int len){return ((long long)(x*exp10[len])%P+y)%P;}

inline void update(node *now){now->val=HASH(now->lson->val,now->rson->val,now->rson->r-now->rson->l+1);}

void B_T(node *now,int l,int r){
	now->l=l;now->r=r;
	if(l==r){
		now->val=str[l]-'0';
		return ;
	}
	now->lson=&pool[++top];
	now->rson=&pool[++top];
	B_T(now->lson,l,(l+r)/2);
	B_T(now->rson,(l+r)/2+1,r);
	update(now);
}

long long query(node *now,int l,int r){
	if(now->l==l && now->r==r) return now->val;
	int ll=now->lson->l,rr=now->rson->r;
	int lr=(ll+rr)/2,rl=lr+1;
	if(r<rl) return query(now->lson,l,r);
	if(l>lr) return query(now->rson,l,r);
	return HASH(query(now->lson,l,lr),query(now->rson,rl,r),r-rl+1);
}

inline void display(int l,int r){
	for(int i=1;i<=l;i++) printf("%c",str[i]);
	printf("+");
	for(int i=l+1;i<=r;i++) printf("%c",str[i]);
	printf("=");
	for(int i=r+1;i<=n;i++) printf("%c",str[i]);
}

void init(){
	long long x,y,z;
	scanf("%s",str+1);
	n=strlen(str+1);
	exp10[0]=1;
	for(int i=1;i<=n;i++) exp10[i]=(exp10[i-1]*10)%P;
	root=&pool[++top];
	B_T(root,1,n);
	for(int i=n/3;i<=n/2;i++){
		if(i+1<=n-i){
			if(str[i+1]!='0' && str[n-i+1]!='0'){
				x=query(root,1,i),y=query(root,i+1,n-i),z=query(root,n-i+1,n);
				//printf("%lld,%lld,%lld\n",x,y,z);
				if((x+y)%P==z){
					display(i,n-i);
					break;
				}
			}
		}
		if(i+1<=n-i-1){
			if(str[i+1]!='0'  && str[n-i]!='0'){
				x=query(root,1,i),y=query(root,i+1,n-i-1),z=query(root,n-i,n);
				//printf("%lld,%lld,%lld\n",x,y,z);
				if((x+y)%P==z){
					display(i,n-i-1);
					break;
				}
			}
		}
		if(1<=n-2*i){
			if(str[n-2*i+1]!='0' && str[n-i+1]!='0'){
				x=query(root,1,n-2*i),y=query(root,n-2*i+1,n-i),z=query(root,n-i+1,n);
				//printf("%lld,%lld,%lld\n",x,y,z);
				if((x+y)%P==z){
					display(n-2*i,n-i);
					break;
				}
			}
		}
		if(1<=n-2*i-1){
			if(str[n-2*i]!='0' && str[n-i]!='0'){
				x=query(root,1,n-2*i-1),y=query(root,n-2*i,n-i-1),z=query(root,n-i,n);
				//printf("%lld,%lld,%lld\n",x,y,z);
				if((x+y)%P==z){
					display(n-2*i-1,n-i-1);
					break;
				}
			}
		}
	}
}

int main(int argc, char** argv) {
	init();
	return 0;
}


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

const int MAXN=1000100;
const int P=1000000007;

struct node{
	int l,r;
	long long val;
	node *lson,*rson;
}pool[10*MAXN],*root;

int n,top=-1;
long long exp10[MAXN];
char str[MAXN];

inline long long HASH(long long x,long long y,int len){return ((long long)(x*exp10[len])%P+y)%P;}

inline void update(node *now){now->val=HASH(now->lson->val,now->rson->val,now->rson->r-now->rson->l+1);}

void B_T(node *now,int l,int r){
	now->l=l;now->r=r;
	if(l==r){
		now->val=str[l]-'0';
		return ;
	}
	now->lson=&pool[++top];
	now->rson=&pool[++top];
	B_T(now->lson,l,(l+r)/2);
	B_T(now->rson,(l+r)/2+1,r);
	update(now);
}

long long query(node *now,int l,int r){
	if(now->l==l && now->r==r) return now->val;
	int ll=now->lson->l,rr=now->rson->r;
	int lr=(ll+rr)/2,rl=lr+1;
	if(r<rl) return query(now->lson,l,r);
	if(l>lr) return query(now->rson,l,r);
	return HASH(query(now->lson,l,lr),query(now->rson,rl,r),r-rl+1);
}

inline void display(int l,int r){
	for(int i=1;i<=l;i++) printf("%c",str[i]);
	printf("+");
	for(int i=l+1;i<=r;i++) printf("%c",str[i]);
	printf("=");
	for(int i=r+1;i<=n;i++) printf("%c",str[i]);
}

void init(){
	long long x,y,z;
	scanf("%s",str+1);
	n=strlen(str+1);
	exp10[0]=1;
	for(int i=1;i<=n;i++) exp10[i]=(exp10[i-1]*10)%P;
	root=&pool[++top];
	B_T(root,1,n);
	for(int i=n/3;i<=n/2;i++){
		if(i+1<=n-i){
			x=query(root,1,i),y=query(root,i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i);
				break;
			}
		}
		if(i+1<=n-i+1){
			x=query(root,1,i),y=query(root,i+1,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i-1);
				break;
			}
		}
		if(1<=n-2*i){
			x=query(root,1,n-2*i),y=query(root,n-2*i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i,n-i);
				break;
			}
		}
		if(1<=n-2*i-1){
			x=query(root,1,n-2*i-1),y=query(root,n-2*i,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i-1,n-i-1);
				break;
			}
		}
	}
}

int main(int argc, char** argv) {
	init();
	return 0;
}


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

const int MAXN=1000100;
const int P=1000000007;

struct node{
	int l,r;
	long long val;
	node *lson,*rson;
}pool[10*MAXN],*root;

int n,top=-1;
long long exp10[MAXN];
char str[MAXN];

inline long long HASH(long long x,long long y,int len){return ((long long)(x*exp10[len])%P+y)%P;}

inline void update(node *now){now->val=HASH(now->lson->val,now->rson->val,now->rson->r-now->rson->l+1);}

void B_T(node *now,int l,int r){
	now->l=l;now->r=r;
	if(l==r){
		now->val=str[l]-'0';
		return ;
	}
	now->lson=&pool[++top];
	now->rson=&pool[++top];
	B_T(now->lson,l,(l+r)/2);
	B_T(now->rson,(l+r)/2+1,r);
	update(now);
}

long long query(node *now,int l,int r){
	if(now->l==l && now->r==r) return now->val;
	int ll=now->lson->l,rr=now->rson->r;
	int lr=(ll+rr)/2,rl=lr+1;
	if(r<rl) return query(now->lson,l,r);
	if(l>lr) return query(now->rson,l,r);
	return HASH(query(now->lson,l,lr),query(now->rson,rl,r),r-rl+1);
}

inline void display(int l,int r){
	for(int i=1;i<=l;i++) printf("%c",str[i]);
	printf("+");
	for(int i=l+1;i<=r;i++) printf("%c",str[i]);
	printf("=");
	for(int i=r+1;i<=n;i++) printf("%c",str[i]);
}

void init(){
	long long x,y,z;
	scanf("%s",str+1);
	n=strlen(str+1);
	exp10[0]=1;
	for(int i=1;i<=n;i++) exp10[i]=(exp10[i-1]*10)%P;
	root=&pool[++top];
	B_T(root,1,n);
	for(int i=n/3;i<=n/2;i++){
		if(i+1<=n-i){
			x=query(root,1,i),y=query(root,i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i);
				break;
			}
		}
		if(i+1<=n-i-1){
			x=query(root,1,i),y=query(root,i+1,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(i,n-i-1);
				break;
			}
		}
		if(1<=n-2*i){
			x=query(root,1,n-2*i),y=query(root,n-2*i+1,n-i),z=query(root,n-i+1,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i,n-i);
				break;
			}
		}
		if(1<=n-2*i-1){
			x=query(root,1,n-2*i-1),y=query(root,n-2*i,n-i-1),z=query(root,n-i,n);
			//printf("%lld,%lld,%lld\n",x,y,z);
			if((x+y)%P==z){
				display(n-2*i-1,n-i-1);
				break;
			}
		}
	}
}

int main(int argc, char** argv) {
	init();
	return 0;
}


#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

const int MAXN=1000100;
const int P=100000007;

struct node{
	int l,r;
	int val;
	node *lson,*rson;
}pool[10*MAXN],*root;

int n,exp10[MAXN],top=-1;
char str[MAXN];

inline int HASH(int x,int y,int len){return ((x*exp10[len])%P+y)%P;}

inline void update(node *now){now->val=HASH(now->lson->val,now->rson->val,now->rson->r-now->rson->l+1);}

void B_T(node *now,int l,int r){
	now->l=l;now->r=r;
	if(l==r){
		now->val=str[l]-'0';
		return ;
	}
	now->lson=&pool[++top];
	now->rson=&pool[++top];
	B_T(now->lson,l,(l+r)/2);
	B_T(now->rson,(l+r)/2+1,r);
	update(now);
}

int query(node *now,int l,int r){
	if(now->l==l && now->r==r) return now->val;
	int ll=now->lson->l,rr=now->rson->r;
	int lr=(ll+rr)/2,rl=lr+1;
	if(r<rl) return query(now->lson,l,r);
	if(l>lr) return query(now->rson,l,r);
	return HASH(query(now->lson,l,lr),query(now->rson,rl,r),r-rl+1);
}

inline void display(int l,int r){
	for(int i=1;i<=l;i++) printf("%c",str[i]);
	printf("+");
	for(int i=l+1;i<=r;i++) printf("%c",str[i]);
	printf("=");
	for(int i=r+1;i<=n;i++) printf("%c",str[i]);
}

void init(){
	int x,y,z;
	scanf("%s",str+1);
	n=strlen(str+1);
	exp10[0]=1;
	for(int i=1;i<=n;i++) exp10[i]=(exp10[i-1]*10)%P;
	root=&pool[++top];
	B_T(root,1,n);
	for(int i=(n+1)/3;i<=(n-1)/2;i++){
		//printf("%d\n",i);
		//i,(),i
		x=query(root,1,i),y=query(root,i+1,n-i),z=query(root,n-i+1,n);
		//printf("%d,%d,%d\n",x,y,z);
		if((x+y)%P==z){
			display(i,n-i);
			break;
		}
		//i,(),i+1
		x=query(root,1,i),y=query(root,i+1,n-i-1),z=query(root,n-i,n);
		//printf("%d,%d,%d\n",x,y,z);
		if((x+y)%P==z){
			display(i,n-i-1);
			break;
		}
		//(),i,i
		x=query(root,1,n-2*i),y=query(root,n-2*i+1,n-i),z=query(root,n-i+1,n);
		//printf("%d,%d,%d\n",x,y,z);
		if((x+y)%P==z){
			display(n-2*i,n-i);
			break;
		}
		//(),i,i+1
		x=query(root,1,n-2*i-1),y=query(root,n-2*i,n-i-1),z=query(root,n-i,n);
		//printf("%d,%d,%d\n",x,y,z);
		if((x+y)%P==z){
			display(n-2*i-1,n-i-1);
			break;
		}
	}
}

int main(int argc, char** argv) {
	init();
	return 0;
}


#include <stdio.h>
#include <iostream>
using namespace std;
char a[1000100];
int n;
bool proc(int i,int j){
	int k,cry,_1,_2,t;
	int tail[3],head[3];
	if(i>=j||i<=0) return false;
	t=max(i,j-i)-(n-j);
	if(t!=0&&t!=-1) return false;
	if(a[0]=='0'&&i>=2) return false;
	if(a[i]=='0'&&j-i>=2) return false;
	if(a[j]=='0'&&n-j>=2) return false;
	bool flag=false;
	if(i==3&&j==5) flag=true;
	tail[0]=i-1,tail[1]=j-1,tail[2]=n-1;
	head[0]=0,head[1]=i,head[2]=j;
	for(k=0,cry=0;;k++){
		if(tail[0]-k<head[0]&&tail[1]-k<head[1]) break;
		if(tail[0]-k<head[0]) _1=0;
		else _1=a[tail[0]-k]-'0';
		if(tail[1]-k<head[1]) _2=0;
		else _2=a[tail[1]-k]-'0';
		t=_1+_2+cry;
		if(t>=10) cry=1,t-=10;
		else cry=0;
		if(tail[2]-k<head[2]) return false;
		if(t!=a[tail[2]-k]-'0') return false;
	}
	if(cry==1){
		if(tail[2]-k<head[2]) return false;
		if(a[tail[2]-k]-'0'!=1) return false;
		k++;
	}
	if(tail[2]-k==head[2]-1) return true;
	return false;
}
bool proc_(int x,int y){
	if(!proc(x,y)) return false;
	int i;
	for(i=0;i<x;i++) printf("%c",a[i]);
	printf("+");
	for(;i<y;i++) printf("%c",a[i]);
	printf("=");
	for(;i<n;i++) printf("%c",a[i]);
	printf("\n");
	return true;
}
int main(){
	int i;
	scanf("%s",a);
	for(i=0;a[i];i++);
	n=i;
	for(i=1;i<n;i++){
		if(proc_(i,n-i)) break;
		if(proc_(i,n-i-1)) break;
		if(proc_(n-2*i,n-i)) break;
		if(proc_(n-1-2*i,n-i-1)) break;
	}
	return 0;
}


#include <stdio.h>
#include <iostream>
using namespace std;
char a[1000100];
int n,modu;
long long mod[1000100],_10[1000100];
long long calc(int y,int x){
	return ((mod[y-1]-(x==0?0:mod[x-1])*_10[y-x])%modu+modu)%modu;
}
bool proc(int i,int j){
	int k,cry,_1,_2,t;
	int tail[3],head[3];
	if(i>=j||i<=0) return false;
	t=max(i,j-i)-(n-j);
	if(t!=0&&t!=-1) return false;
	if(a[0]=='0'&&i>=2) return false;
	if(a[i]=='0'&&j-i>=2) return false;
	if(a[j]=='0'&&n-j>=2) return false;
	if((calc(i,0)+calc(j,i))%modu!=calc(n,j)) return false;
	tail[0]=i-1,tail[1]=j-1,tail[2]=n-1;
	head[0]=0,head[1]=i,head[2]=j;
	for(k=0,cry=0;;k++){
		if(tail[0]-k<head[0]&&tail[1]-k<head[1]) break;
		if(tail[0]-k<head[0]) _1=0;
		else _1=a[tail[0]-k]-'0';
		if(tail[1]-k<head[1]) _2=0;
		else _2=a[tail[1]-k]-'0';
		t=_1+_2+cry;
		if(t>=10) cry=1,t-=10;
		else cry=0;
		if(tail[2]-k<head[2]) return false;
		if(t!=a[tail[2]-k]-'0') return false;
	}
	if(cry==1){
		if(tail[2]-k<head[2]) return false;
		if(a[tail[2]-k]-'0'!=1) return false;
		k++;
	}
	if(tail[2]-k==head[2]-1) return true;
	return false;
}
bool proc_(int x,int y){
	if(!proc(x,y)) return false;
	int i;
	for(i=0;i<x;i++) printf("%c",a[i]);
	printf("+");
	for(;i<y;i++) printf("%c",a[i]);
	printf("=");
	for(;i<n;i++) printf("%c",a[i]);
	printf("\n");
	return true;
}
int main(){
	int i;
	long long p,q;
	modu=1000000007;
 	scanf("%s",a);
	for(i=0;a[i];i++);
	n=i;
	for(p=0,q=1,i=0;i<n;i++){
		p=p*10+(a[i]-'0')%modu;
		mod[i]=p;
		_10[i]=q;
		q=q*10%modu;
	}
	_10[n]=q;
	for(i=1;i<n;i++){
		if(proc_(i,n-i)) break;
		if(proc_(i,n-i-1)) break;
		if(proc_(n-2*i,n-i)) break;
		if(proc_(n-1-2*i,n-i-1)) break;
	}
	return 0;
}


#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define fi first
#define eps 0.00000000000000000000001
#define se second
#define x1 sfhshfd
#define y1 sfhs321321hfd
#define glhf ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define GG cout << " OPANA " << endl;

using namespace std;
using namespace __gnu_pbds;

typedef int ll;
typedef long double ld;
typedef pair<ll,ll> pairll;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> SATANA;

const ll DIM=3e5+7;
const ll INF=1e17+7;

ll n;
ll k;
ll v1,v2;
vector<ll> a[DIM];
ll md;
ll dep[DIM];
ll p[21][DIM];
ll tin[DIM];
ll tout[DIM];
ll timer;ll A,B,C;
void dfs(ll v, ll dist, ll par, ll t)
{
    if(dist>md)
    {
        md=dist;
        k=v;
    }

    for(auto to:a[v])
    {
        if(to!=par)
        {
            dfs(to,dist+1,v,t);
        }
    }
}

void calclca(ll v, ll par, ll lvl){

        timer++;

        tin[v]=timer;

        dep[v]=lvl;

        p[0][v]=par;
        //cout << par << endl;
        for(int i=1; i<=20; i++)
        {

            p[i][v]=p[i-1][p[i-1][v]];
            //cout << v << " " << i << " " << p[i][v] << endl;
        }

    for(auto to:a[v]){

        if(to!=par) calclca(to,v,lvl+1);
    }
    tout[v]=++timer;
}

ll upper(ll v1, ll v2){
    return (tin[v1]<=tin[v2] && tout[v2]<=tout[v1]);
}

ll lca(ll v1, ll v2)
{
    if(upper(v1,v2)) return v1;
    if(upper(v2,v1)) return v2;

    for(int i=20; i>=0; i--){
        if(!upper(p[i][v1],v2)) v1=p[i][v1];
    }
    //cout << v1 << "V!1" << endl;
    //cout << p[0][v1] << "PV1" << endl;
    return p[0][v1];
}
ll D1[DIM];
ll D2[DIM];

ll check(ll v, ll v1, ll v2){

    ll k1=lca(v1,v);
    ll k2=lca(v2,v);

    ll K=lca(v1,v2);

    if((v==k1 || v==k2) && (lca(K,v)==K)) return 1;
    return 0;
}
int main()
{
    glhf;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        cin >> v1 >> v2;
        D1[i]=v1;
        D2[i]=v2;
        a[v1].push_back(v2);
        a[v2].push_back(v1);
    }
    k=1;

    calclca(1,1,0);
    dfs(1,0,1,1);
    A=k;
    md=0;
    k=A;
    dfs(A,0,A,2);
    B=k;
    //cout << A << " " << B << " " << md << endl;

    ll p1,p2,Z;
    ll res=0;

    //cout << lca(2,4) << endl;
    ll opa=lca(A,B);
    for(int i=1; i<=n; i++){

        if(i==A || i==B) continue;

        p1=lca(i,A);
        p2=lca(i,B);

        if(p1==i && p2!=i) continue;
        if(p1!=i && p2==i) continue;

        if(p1==i && p2==i){

            Z=abs(dep[opa]-dep[i]);
            if(Z>res){
            res=Z;
            C=i;
        }

            continue;
        }
        //cout << i << " " << p1 << " " << p2 << endl;
        Z=min(abs(dep[i]-dep[p1])    ,abs(dep[i]-dep[p2])   );
        if(Z>res){
            res=Z;
            C=i;
        }
    }

    for(int i=1; i<=n; i++){
        if(i!=A && i!=B && C==0) C=i;
    }
    /*res=0;
    for(int i=1; i<n; i++){

        v1=D1[i];
        v2=D2[i];

        if( (check(v1,A,B) && check(v2,A,B) ) || (check(v1,A,C) && check(v2,A,C) ) || (check(v1,C,B) && check(v2,C,B) )) res++;
    }*/
    cout << res+md << endl;
    cout << A << " " << B << " " << C << endl;
    return 0;
}


#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define fi first
#define eps 0.00000000000000000000001
#define se second
#define x1 sfhshfd
#define y1 sfhs321321hfd
#define glhf ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define GG cout << " OPANA " << endl;

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pairll;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> SATANA;

const ll DIM=3e5+7;
const ll INF=1e17+7;

ll n;
ll k;
ll v1,v2;
vector<ll> a[DIM];
ll md;
ll dep[DIM];
ll p[21][DIM];
ll tin[DIM];
ll tout[DIM];
ll timer;ll A,B,C;
void dfs(ll v, ll dist, ll par, ll t)
{
    if(dist>md)
    {
        md=dist;
        k=v;
    }

    for(auto to:a[v])
    {
        if(to!=par)
        {
            dfs(to,dist+1,v,t);
        }
    }
}

void calclca(ll v, ll par, ll lvl){

        timer++;

        tin[v]=timer;

        dep[v]=lvl;

        p[0][v]=par;
        //cout << par << endl;
        for(int i=1; i<=20; i++)
        {

            p[i][v]=p[i-1][p[i-1][v]];
            //cout << v << " " << i << " " << p[i][v] << endl;
        }

    for(auto to:a[v]){

        if(to!=par) calclca(to,v,lvl+1);
    }
    tout[v]=++timer;
}

ll upper(ll v1, ll v2){
    return (tin[v1]<=tin[v2] && tout[v2]<=tout[v1]);
}

ll lca(ll v1, ll v2)
{
    if(upper(v1,v2)) return v1;
    if(upper(v2,v1)) return v2;

    for(int i=20; i>=0; i--){
        if(!upper(p[i][v1],v2)) v1=p[i][v1];
    }
    //cout << v1 << "V!1" << endl;
    //cout << p[0][v1] << "PV1" << endl;
    return p[0][v1];
}
ll D1[DIM];
ll D2[DIM];

ll check(ll v, ll v1, ll v2){

    ll k1=lca(v1,v);
    ll k2=lca(v2,v);

    if(v==k1 || v==k2) return 1;
    return 0;
}
int main()
{
    glhf;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        cin >> v1 >> v2;
        D1[i]=v1;
        D2[i]=v2;
        a[v1].push_back(v2);
        a[v2].push_back(v1);
    }
    k=1;

    calclca(1,1,0);
    dfs(1,0,1,1);
    A=k;
    md=0;
    k=A;
    dfs(A,0,A,2);
    B=k;
    //cout << A << " " << B << " " << md << endl;

    ll p1,p2,Z;
    ll res=0;

    //cout << lca(2,4) << endl;
    ll opa=lca(A,B);
    for(int i=1; i<=n; i++){

        if(i==A || i==B) continue;
        if(C==0) C=i;
        p1=lca(i,A);
        p2=lca(i,B);

        if(p1==i && p2!=i) continue;
        if(p1!=i && p2==i) continue;

        if(p1==i && p2==i){

            Z=abs(dep[opa]-dep[i]);
            if(Z>res){
            res=Z;
            C=i;
        }

            continue;
        }
        //cout << i << " " << p1 << " " << p2 << endl;
        Z=min(abs(dep[i]-dep[p1])    ,abs(dep[i]-dep[p2])   );
        if(Z>res){
            res=Z;
            C=i;
        }
    }
    res=0;
    for(int i=1; i<n; i++){

        v1=D1[i];
        v2=D2[i];

        if( (check(v1,A,B) && check(v2,A,B) ) || (check(v1,A,C) && check(v2,A,C) ) || (check(v1,C,B) && check(v2,C,B) )) res++;
    }
    cout << res << endl;
    cout << A << " " << B << " " << C << endl;
    return 0;
}


#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define fi first
#define eps 0.00000000000000000000001
#define se second
#define x1 sfhshfd
#define y1 sfhs321321hfd
#define glhf ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define GG cout << " OPANA " << endl;

using namespace std;
using namespace __gnu_pbds;

typedef int ll;
typedef long double ld;
typedef pair<ll,ll> pairll;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> SATANA;

const ll DIM=3e5+7;
const ll INF=1e17+7;

ll n;
ll k;
ll v1,v2;
vector<ll> a[DIM];
ll md,res;
ll A,B,C;
ll p[DIM];

vector<ll> diametr;
void dfs(ll v, ll dist, ll par, ll t)
{
    p[v]=par;
    if(dist>md)
    {
        md=dist;
        k=v;
    }

    for(auto to:a[v])
    {
        if(to!=par)
        {
            dfs(to,dist+1,v,t);
        }
    }
}

ll D1[DIM];
ll now;
ll D2[DIM];

void check(ll v, ll par, ll dist){

    if(dist>res){
        res=dist;
        C=v;
    }
    for(auto to:a[v]){
        if(to==par) continue;
        cout << to << " TO " << diametr[now+1] << endl;
        if(to==diametr[now+1]){
            continue;
        }
        check(to,v,dist+1);
    }
}

int main()
{
    glhf;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        cin >> v1 >> v2;
        D1[i]=v1;
        D2[i]=v2;
        a[v1].push_back(v2);
        a[v2].push_back(v1);
    }
    k=1;

    dfs(1,0,1,1);

    A=k;

    md=0;

    k=A;

    dfs(A,0,A,2);

    B=k;

    ll v=B;

    while(v!=A)
    {
        diametr.push_back(v);
        v=p[v];
    }
    diametr.push_back(A);
    if(diametr.size()==n-1)
    {
        for(int i=1; i<=n; i++)
            if(A!=i && B!=i)
            {

                cout << n-1 << endl << A << " " << B << " " << i << endl;
                return 0;
            }
    }

    diametr.push_back(0);
    now=1;
    for(int i=0; i<diametr.size()-1; i++){
        ll to=diametr[i];
        now=i;
        if(i==0) check(to,to,0);
        else check(to,diametr[i-1],0);
        cout << i << " " << diametr[i] << " " << res << endl;

    }
    cout << md << endl;
    cout << res+md << endl;
    cout << A << " " << B << " " << C << endl;
    return 0;
}


#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define fi first
#define eps 0.00000000000000000000001
#define se second
#define x1 sfhshfd
#define y1 sfhs321321hfd
#define glhf ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define GG cout << " OPANA " << endl;

using namespace std;
using namespace __gnu_pbds;

typedef int ll;
typedef long double ld;
typedef pair<ll,ll> pairll;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> SATANA;

const ll DIM=3e5+7;
const ll INF=1e17+7;

ll n;
ll k;
ll v1,v2;
vector<ll> a[DIM];
ll md;
ll dep[DIM];
ll p[21][DIM];
ll tin[DIM];
ll tout[DIM];
ll timer;ll A,B,C;
void dfs(ll v, ll dist, ll par, ll t)
{
    if(dist>md)
    {
        md=dist;
        k=v;
    }

    for(auto to:a[v])
    {
        if(to!=par)
        {
            dfs(to,dist+1,v,t);
        }
    }
}

void calclca(ll v, ll par, ll lvl){

        timer++;

        tin[v]=timer;

        dep[v]=lvl;

        p[0][v]=par;
        //cout << par << endl;
        for(int i=1; i<=20; i++)
        {

            p[i][v]=p[i-1][p[i-1][v]];
            //cout << v << " " << i << " " << p[i][v] << endl;
        }

    for(auto to:a[v]){

        if(to!=par) calclca(to,v,lvl+1);
    }
    tout[v]=++timer;
}

ll upper(ll v1, ll v2){
    return (tin[v1]<=tin[v2] && tout[v2]<=tout[v1]);
}

ll lca(ll v1, ll v2)
{
    if(upper(v1,v2)) return v1;
    if(upper(v2,v1)) return v2;

    for(int i=20; i>=0; i--){
        if(!upper(p[i][v1],v2)) v1=p[i][v1];
    }
    //cout << v1 << "V!1" << endl;
    //cout << p[0][v1] << "PV1" << endl;
    return p[0][v1];
}
ll D1[DIM];
ll D2[DIM];

ll check(ll v, ll v1, ll v2){

    ll k1=lca(v1,v);
    ll k2=lca(v2,v);

    ll K=lca(v1,v2);

    if((v==k1 || v==k2) && (lca(K,v)==K)) return 1;
    return 0;
}
int main()
{
    glhf;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        cin >> v1 >> v2;
        D1[i]=v1;
        D2[i]=v2;
        a[v1].push_back(v2);
        a[v2].push_back(v1);
    }
    k=1;

    calclca(1,1,0);
    dfs(1,0,1,1);
    A=k;
    md=0;
    k=A;
    dfs(A,0,A,2);
    B=k;
    //cout << A << " " << B << " " << md << endl;

    ll p1,p2,Z;
    ll res=0;

    //cout << lca(2,4) << endl;
    ll opa=lca(A,B);
    for(int i=1; i<=n; i++){

        if(i==A || i==B) continue;
        if(C==0) C=i;
        p1=lca(i,A);
        p2=lca(i,B);

        if(p1==i && p2!=i) continue;
        if(p1!=i && p2==i) continue;

        if(p1==i && p2==i){

            Z=abs(dep[opa]-dep[i]);
            if(Z>res){
            res=Z;
            C=i;
        }

            continue;
        }
        //cout << i << " " << p1 << " " << p2 << endl;
        Z=min(abs(dep[i]-dep[p1])    ,abs(dep[i]-dep[p2])   );
        if(Z>res){
            res=Z;
            C=i;
        }
    }
    /*res=0;
    for(int i=1; i<n; i++){

        v1=D1[i];
        v2=D2[i];

        if( (check(v1,A,B) && check(v2,A,B) ) || (check(v1,A,C) && check(v2,A,C) ) || (check(v1,C,B) && check(v2,C,B) )) res++;
    }*/
    cout << res << endl;
    cout << A << " " << B << " " << C << endl;
    return 0;
}


#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define fi first
#define eps 0.00000000000000000000001
#define se second
#define x1 sfhshfd
#define y1 sfhs321321hfd
#define glhf ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define GG cout << " OPANA " << endl;

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pairll;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> SATANA;

const ll DIM=3e5+7;
const ll INF=1e17+7;

ll n;
ll k;
ll v1,v2;
vector<ll> a[DIM];
ll md;
ll dep[DIM];
ll p[21][DIM];
ll tin[DIM];
ll tout[DIM];
ll timer;ll A,B,C;
void dfs(ll v, ll dist, ll par, ll t)
{
    if(dist>md)
    {

        if(t==2 && v==A);
        else{
        md=dist;
        k=v;
        }
    }

    for(auto to:a[v])
    {
        if(to!=par)
        {
            dfs(to,dist+1,v,t);
        }
    }
}

void calclca(ll v, ll par, ll lvl){

        timer++;

        tin[v]=timer;

        dep[v]=lvl;

        p[0][v]=par;
        //cout << par << endl;
        for(int i=1; i<=20; i++)
        {

            p[i][v]=p[i-1][p[i-1][v]];
            //cout << v << " " << i << " " << p[i][v] << endl;
        }

    for(auto to:a[v]){

        if(to!=par) calclca(to,v,lvl+1);
    }
    tout[v]=++timer;
}

ll upper(ll v1, ll v2){
    return (tin[v1]<=tin[v2] && tout[v2]<=tout[v1]);
}

ll lca(ll v1, ll v2)
{
    if(upper(v1,v2)) return v1;
    if(upper(v2,v1)) return v2;

    for(int i=20; i>=0; i--){
        if(!upper(p[i][v1],v2)) v1=p[i][v1];
    }
    //cout << v1 << "V!1" << endl;
    //cout << p[0][v1] << "PV1" << endl;
    return p[0][v1];
}

int main()
{
    glhf;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        cin >> v1 >> v2;
        a[v1].push_back(v2);
        a[v2].push_back(v1);
    }
    k=1;

    calclca(1,1,0);
    dfs(1,0,1,1);
    A=k;
    md=0;
    k=A;
    dfs(A,0,A,2);
    B=k;
    //cout << A << " " << B << " " << md << endl;

    ll p1,p2,Z;
    ll res=0;

    //cout << lca(2,4) << endl;
    for(int i=1; i<=n; i++){

        if(i==A || i==B) continue;

        p1=lca(i,A);
        p2=lca(i,B);

        if(p1==i || p2==i) continue;
        //cout << i << " " << p1 << " " << p2 << endl;
        Z=min(dep[i]-dep[p1]    ,dep[i]-dep[p2]   );
        if(Z>res){
            res=Z;
            C=i;
        }
    }

    cout << res+md << endl;
    cout << A << " " << B << " " << C << endl;
    return 0;
}


#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define fi first
#define eps 0.00000000000000000000001
#define se second
#define x1 sfhshfd
#define y1 sfhs321321hfd
#define glhf ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define GG cout << " OPANA " << endl;

using namespace std;
using namespace __gnu_pbds;

typedef int ll;
typedef long double ld;
typedef pair<ll,ll> pairll;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> SATANA;

const ll DIM=3e5+7;
const ll INF=1e17+7;

ll n;
ll k;
ll v1,v2;
vector<ll> a[DIM];
ll md,res;
ll A,B,C;
ll p[DIM];

vector<ll> diametr;
void dfs(ll v, ll dist, ll par, ll t)
{
    p[v]=par;
    if(dist>md)
    {
        md=dist;
        k=v;
    }

    for(auto to:a[v])
    {
        if(to!=par)
        {
            dfs(to,dist+1,v,t);
        }
    }
}

ll D1[DIM];
ll now;
ll D2[DIM];

void check(ll v, ll par, ll dist){

    if(dist>res){
        res=dist;
        C=v;
    }
    for(auto to:a[v]){
        if(to==par) continue;
        //cout << to << " TO " << diametr[now+1] << endl;
        if(to==diametr[now+1]){
            continue;
        }
        check(to,v,dist+1);
    }
}

int main()
{
    glhf;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        cin >> v1 >> v2;
        D1[i]=v1;
        D2[i]=v2;
        a[v1].push_back(v2);
        a[v2].push_back(v1);
    }
    k=1;

    dfs(1,0,1,1);

    A=k;

    md=0;

    k=A;

    dfs(A,0,A,2);

    B=k;

    ll v=B;

    while(v!=A)
    {
        diametr.push_back(v);
        v=p[v];
    }
    diametr.push_back(A);
    if(diametr.size()==n)
    {
        for(int i=1; i<=n; i++)
            if(A!=i && B!=i)
            {

                cout << n-1 << endl << A << " " << B << " " << i << endl;
                return 0;
            }
    }

    diametr.push_back(0);
    now=1;
    for(int i=0; i<diametr.size()-1; i++){
        ll to=diametr[i];
        now=i;
        if(i==0) check(to,to,0);
        else check(to,diametr[i-1],0);
        //cout << i << " " << diametr[i] << " " << res << endl;
        //cout << to << endl;

    }
    //cout << md << endl;
    for(int i=1; i<=n; i++){
        if(C==0 && i!=A && i!=B) {
            C=i;
            break;
        }
    }
    cout << res+md << endl;
    cout << A << " " << B << " " << C << endl;
    return 0;
}


#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define fi first
#define eps 0.00000000000000000000001
#define se second
#define x1 sfhshfd
#define y1 sfhs321321hfd
#define glhf ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define GG cout << " OPANA " << endl;

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pairll;
typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> SATANA;

const ll DIM=3e5+7;
const ll INF=1e17+7;

ll n;
ll k;
ll v1,v2;
vector<ll> a[DIM];
ll md;
ll dep[DIM];
ll p[21][DIM];
ll tin[DIM];
ll tout[DIM];
ll timer;ll A,B,C;
void dfs(ll v, ll dist, ll par, ll t)
{
    if(dist>md)
    {

        if(t==2 && v==A);
        else{
        md=dist;
        k=v;
        }
    }

    for(auto to:a[v])
    {
        if(to!=par)
        {
            dfs(to,dist+1,v,t);
        }
    }
}

void calclca(ll v, ll par, ll lvl){

        timer++;

        tin[v]=timer;

        dep[v]=lvl;

        p[0][v]=par;
        //cout << par << endl;
        for(int i=1; i<=20; i++)
        {

            p[i][v]=p[i-1][p[i-1][v]];
            //cout << v << " " << i << " " << p[i][v] << endl;
        }

    for(auto to:a[v]){

        if(to!=par) calclca(to,v,lvl+1);
    }
    tout[v]=++timer;
}

ll upper(ll v1, ll v2){
    return (tin[v1]<=tin[v2] && tout[v2]<=tout[v1]);
}

ll lca(ll v1, ll v2)
{
    if(upper(v1,v2)) return v1;
    if(upper(v2,v1)) return v2;

    for(int i=20; i>=0; i--){
        if(!upper(p[i][v1],v2)) v1=p[i][v1];
    }
    //cout << v1 << "V!1" << endl;
    //cout << p[0][v1] << "PV1" << endl;
    return p[0][v1];
}

int main()
{
    glhf;
    cin >> n;
    for(int i=1; i<n; i++)
    {
        cin >> v1 >> v2;
        a[v1].push_back(v2);
        a[v2].push_back(v1);
    }
    k=1;

    calclca(1,1,0);
    dfs(1,0,1,1);
    A=k;
    md=0;
    k=A;
    dfs(A,0,A,2);
    B=k;
    //cout << A << " " << B << " " << md << endl;

    ll p1,p2,Z;
    ll res=0;

    //cout << lca(2,4) << endl;
    ll opa=lca(A,B);
    for(int i=1; i<=n; i++){

        if(i==A || i==B) continue;
        if(C==0) C=i;
        p1=lca(i,A);
        p2=lca(i,B);

        if(p1==i && p2!=i) continue;
        if(p1!=i && p2==i) continue;

        if(p1==i && p2==i){

            Z=abs(dep[opa]-dep[i]);
            if(Z>res){
            res=Z;
            C=i;
        }

            continue;
        }
        //cout << i << " " << p1 << " " << p2 << endl;
        Z=min(abs(dep[i]-dep[p1])    ,abs(dep[i]-dep[p2])   );
        if(Z>res){
            res=Z;
            C=i;
        }
    }

    cout << res+md << endl;
    cout << A << " " << B << " " << C << endl;
    return 0;
}