#pragma GCC optimize("O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
#pragma GCC optimize("unroll-loops")  
 
#include<bits/stdc++.h>
using namespace std;
 
/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
*/ 
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;
 
typedef vector<int> vl;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<pi> vpi;
typedef vector<pl> vpl; 
typedef vector<vl> vi;
 
#define ts to_string
#define fe first
#define se second
#define all(x) (x).begin(), (x).end()
#define sz(v) ((int)(v).size())
#define rall(x) (x).rbegin(), (x).rend()
#define pb push_back 
#define mt make_tuple 
#define eb emplace_back
#define mp make_pair
#define lb lower_bound 
#define ub upper_bound 

#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define trav(a,x) for (auto& a: x)
 
struct fhash { 
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
	}
    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
	}
};
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll randint(ll a, ll b) { 
	return uniform_int_distribution<ll>(a, b)(rng);}
 
template<class T> int fd(const T& n){  return (int)(n/pow(10,(int)log10(n))); } //first digit
ll fstTrue(function<bool(ll)> f, ll lb, ll rb) {
	while(lb<rb) {
		ll mb=(lb+rb)/2;
		f(mb)?rb=mb:lb=mb+1; 
	} 
	return lb;
}
ll lstTrue(function<bool(ll)> f, ll lb, ll rb) {
	while(lb<rb) {
		ll mb=(lb+rb+1)/2;
		f(mb)?lb=mb:rb=mb-1; 
	} 
	return lb;
}
bool pow2(int i){ return i&&(i&-i)==i;}
constexpr int pct(int x) { return __builtin_popcount(x); } 
constexpr int bits(int x) { return 31-__builtin_clz(x); } // floor(log2(x)) 
ll gcd(ll a,ll b) {  return b?gcd(b,a%b):a;}
 
#define cbit(n, b) (((n) >> (b)) & 1)
#define sbit(n, b) ((n) | (static_cast<decay<decltype(n)>::type>(1) << (b)))
#define rbit(n, b) ((n) & ~(static_cast<decay<decltype(n)>::type>(1) << (b)))
#define fbit(n, b) ((n) ^ (static_cast<decay<decltype(n)>::type>(1) << (b)))
 
template<class T> bool chmin(T& a, const T& b) {
	return b < a? a = b, 1 : 0; }
template<class T> bool chmax(T& a, const T& b) {
	return a < b ? a = b, 1 : 0; } 
 
template<class T> void remdup(vector<T>& v) {  
	sort(all(v)); v.erase(unique(all(v)),end(v)); }
bool inc(int a,int b,int c){
	return a<=b&&b<=c;
}

// TO_STRING
template <class A, class B, class C> string ts(tuple<A, B, C> p);
template <class A, class B, class C, class D> string ts(tuple<A, B, C, D> p);
string ts(char c) { return string(1,c); }
string ts(bool b) { 
    #ifdef __APPLE__
		return b ? "true" : "false"; 
	#else 
		return ts((int)b);
	#endif
}
string ts(const char* s) { return (string)s; }
string ts(string s) { return s; }
template<class A> string ts(complex<A> c) { 
	stringstream ss; ss << c; return ss.str(); }
string ts(vector<bool> v) { 
	string res = "{"; F0R(i,sz(v)) res += char('0'+v[i]);
	res += "}"; return res; }
template<size_t SZ> string ts(bitset<SZ> b) {
	string res = ""; F0R(i,sz(b)) res += char('0'+b[i]);
	return res; }
template<class A, class B> string ts(pair<A,B> p);
template<class T> string ts(T v) { // containers with begin(), end()
	#ifdef __APPLE__
		bool fst = 1; string res = "{";
		for (const auto& x: v) {
			if (!fst) res += ", ";
			fst = 0; res += ts(x);
		}
		res += "}"; return res;
	#else
		bool fst = 1; string res = "";
		for (const auto& x: v) {
			if (!fst) res += " ";
			fst = 0; res += ts(x);
		}
		return res;
	#endif
}
template<class A, class B> string ts(pair<A,B> p) {
	#ifdef __APPLE__
		return "("+ts(p.fe)+", "+ts(p.se)+")"; 
	#else
		return ts(p.fe)+" "+ts(p.se);
	#endif
}
template<class A, class B, class C> string ts(tuple<A, B, C> p) { 
	#ifdef __APPLE__
	    return "("+ts(get<0>(p))+","+ts(get<1>(p))+","+ts(get<2>(p))+")";
	#else 
	    return ts(get<0>(p))+" "+ts(get<1>(p))+" "+ts(get<2>(p));
	#endif
}
template <class A,class B, class C, class D> string ts(tuple<A, B, C, D> p) {
	#ifdef __APPLE__
	    return "("+ts(get<0>(p)) + ","+ts(get<1>(p))+","+ts(get<2>(p)) + ","+ts(get<3>(p)) + ")";
	#else 
	    return ts(get<0>(p))+" "+ts(get<1>(p))+" "+ts(get<2>(p))+" "+ts(get<3>(p));
	#endif
}
//INPUT 
//void re(string& d){getline(cin,d) ;getline(cin,d); }
template<class A> void re(complex<A>& c);
template<class A, class B> void re(pair<A,B>& p);
template<class A> void re(vector<A>& v);
template<class A, size_t SZ> void re(array<A,SZ>& a);
 
template<class T> void re(T& x) { cin >> x; }
void re(double& d) { string t; re(t); d = stod(t); }
void re(ld& d) { string t; re(t); d = stold(t); }
template<class H, class... T> void re(H& h, T&... t) { re(h); re(t...); }
template<class A> void re(complex<A>& c) { A a,b; re(a,b); c = {a,b}; }
template<class A, class B> void re(pair<A,B>& p) { re(p.fe,p.se); }
template<class A> void re(vector<A>& x) { trav(a,x) re(a); }
template<class A, size_t SZ> void re(array<A,SZ>& x) { trav(a,x) re(a); }
//OUTPUT
template<class A> void pr(A x) { cout << ts(x); } 
template<class H, class... T> void pr(const H& h, const T&... t) { 
	pr(h); pr(t...); }
void ps() { pr("\n"); } // print w/ spaces
template<class H, class... T> void ps(const H& h, const T&... t) { 
	pr(h); if (sizeof...(t)) pr(" "); ps(t...); }
//DEBUG
void DBG() { cerr << "]" << endl; }
template<class H, class... T> void DBG(H h, T... t) {
	cerr << ts(h); if (sizeof...(t)) cerr << ", ";
	DBG(t...); }
#ifdef __APPLE__ //chk -> instead of assert so no TLE 
	#define dbg(...) cerr << "Line(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
	#define chk(...) if (!(__VA_ARGS__)) cerr << "Line(" << __LINE__ << ") -> function(" \
		 << __FUNCTION__  << ") -> CHK FAILED: (" << #__VA_ARGS__ << ")" << "\n", exit(0);
#else
	#define dbg(...) 0
	#define chk(...) 0
#endif

const int di[4]={1,0,-1,0},dj[4]={0,1,0,-1};
const int di8[8]={-1, -1, 0, 1, 1, 1, 0, -1}, dj8[8]={0, 1, 1, 1, 0, -1, -1, -1};
//const int MOD = 1e9+7, MOD2 =998244353;
const ld PI = acos((ld)-1);

void IOS(int n){
  ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); 
  cout.precision(n); cerr.precision(n); cerr << fixed; cout << fixed;}
const int mxN =2e5;


void solve(){
    string s; ll u = 0; re(s); trav(i,s) u+=i-'0';
    if(u%9==0) ps("Yes");
    else ps("No");
}
int main(){
	IOS(10);
	int t=1; //re(t);
	F0R(i,t) solve(); 
#ifdef __APPLE__
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
}
 
 
//find_by_order(k) returns iterator to kth element starting from 0;
//order_of_key(k) returns count of elements strictly smaller than k;
//vl split(string s){ vl v; stringstream ss(s); for (int i; ss >> i;) { v.pb(i); 
//if (ss.peek() == ',') ss.ignore(); } return v; }




Measured memory_bytes: 3732