// Original C++ solution (slower):
/**

 * code generated by JHelper

 * More info: https://github.com/AlexeyDmitriev/JHelper

 * @author champon

 */



#include <iostream>

#include <fstream>



#include <bits/stdc++.h>

using namespace std;

#define ll long long

#define rep(i, n) for(ll i=0; i<n; i++)

#define repr(i, s, e) for(ll i=s; i>=e; i--)

#define reps(i, s, e) for(ll i=s; i<=e; i++)

#define inf 1e18

#define all(v) v.begin(),v.end()

#define ceill(a, b) (a+b-1)/b

#define ok cout << "ok" << endl;

#define sp << " " <<

void ans(bool b){ cout << (b ? "Yes" : "No") << endl; }

void ans2(bool b){ cout << (b ? "YES" : "NO") << endl; }

template<typename T> inline bool chmax(T &a, T b){ if(a<b) a=b; return a<b; }

template<typename T> inline bool chmin(T &a, T b){ if(b<a) a=b; return b<a; }

template<typename A, size_t N, typename T>

void Fill(A (&array)[N], const T &val){

    fill((T*)array, (T*)(array+N), val);

}

template<typename T> void vdeb(T v){

    cout << "#vector set debug" << endl;

    for(auto vv : v) cout << vv << " ";

    cout << endl;

}

template<typename T1, typename T2> void adeb(T1 arr[], T2 n){

    cout << "#adebug" << endl;

    for(int i=0; i<=n; i++) cout << arr[i] << " ";

    cout << endl;

}

template<typename T1> void mdeb(T1 mp){

    cout << "#map pair debug" << endl;

    for(auto const& m : mp) cout << m.first sp m.second << endl;

}

int dx[] = {1, 0, -1, 0, 1, -1, 1, -1};

int dy[] = {0, 1, 0, -1, 1, -1, -1, 1};





class DCrossing {

public:

	void solve(std::istream& in, std::ostream& out) {

        int n;

        in >> n;

        bool flg = false;

        int x = sqrt(2*n);

        if(x*(x+1) / 2 == n) flg = true;

        if(!flg){

            out << "No" << endl;

            return;

        }

        out << "Yes" << endl;



        int k = x + 1;

        vector<int> s[100010];

        int num = 1;

        int ind = 0;

        rep(i, x){

            rep(j, i+1){

                s[ind].push_back(num);

                s[i+1].push_back(num);

                ind++;

                num++;

            }

            ind = 0;

        }



//        rep(i, 3){

//            cout << i << " ";

//            for(auto const& e : s[i]){

//                cout << e << " ";

//            }

//            cout << endl;

//        }



        out << k << endl;

        rep(i, k){

            out << x << " ";

            rep(j, x){

                out << s[i][j] << " ";

            }

            out << endl;

        }

	}

};





int main() {

	DCrossing solver;

	std::istream& in(std::cin);

	std::ostream& out(std::cout);

	solver.solve(in, out);

	return 0;

}


// Optimized solution to the same problem (faster):
/**

 * code generated by JHelper

 * More info: https://github.com/AlexeyDmitriev/JHelper

 * @author champon

 */



#include <iostream>

#include <fstream>

#include <bits/stdc++.h>

#define se cout << "test ok" << endl;

#define sp << " " <<

#define enl "\n"

using namespace std;

using ll=long long;

using ld=long double;

using vi = vector<int>;

using vii = vector<vector<int>>;

using vl = vector<ll>;

using vll = vector<vector<ll>>;

using vlll = vector<vector<vector<ll>>>;

using vc = vector<char>;

using vcc = vector<vector<char>>;

using pi = pair<int, int>;

using pl = pair<ll, ll>;

ll mod = ll(1e9)+7;

ll inf = ll(1e18);

void bl(bool b, ostream& out=cout){ out << (b ? "Yes" : "No") << endl; }

void bl2(bool b, ostream& out=cout){ out << (b ? "YES" : "NO") << endl; }

template<typename T> inline bool chmax(T &a, T b){ if(a<b){a=b; return true;} return false; }

template<typename T> inline bool chmin(T &a, T b){ if(a>b){a=b; return true;} return false; }

int dx[] = {1, 0, -1, 0, 1, -1, 1, -1};

int dy[] = {0, 1, 0, -1, 1, -1, -1, 1};



#ifndef INCLUDE_DEBUG_HPP

#define INCLUDE_DEBUG_HPP



#include <iostream>

#include <vector>

#include <map>

using namespace std;



namespace dbg {

    using ll = long long;



    class Debug {

    public:

        Debug(){}

        template<typename T>

        void vd(vector<T> vec);

        template<typename T>

        void vd2(vector<vector<T>> vec);

        template<typename T>

        void ad(T *arr, ll n);

        template<typename T, size_t N>

        void ad2(T (&arr)[N], ll n);

        template<typename T>

        void md(T mp);

    };



    template<typename T>

    void Debug::vd(vector<T> vec) {

        for (auto vv : vec) cout << vv << " ";

        cout << endl;

    }



    template<typename T>

    void Debug::vd2(vector<vector<T>> vec) {

        for (auto vv : vec) {

            for (auto vvv : vv) cout << vvv << " ";

            cout << endl;

        }

    }



    template<typename T>

    void Debug::ad(T *arr, ll n) {

        for (int i = 0; i <= n; i++) cout << arr[i] << " ";

        cout << endl;

    }



    template<typename T, size_t N>

    void Debug::ad2(T (&arr)[N], ll n) {

        for (int i = 0; i <= N; i++) for (int j = 0; j <= n; j++) cout << arr[i][j] << " ";

        cout << endl;

    }



    template<typename T>

    void Debug::md(T mp) {

        cout << "key : value" << endl;

        for (auto const &m : mp) cout << m.first << " : " << m.second << endl;

        cout << endl;

    }



}



#endif //INCLUDE_DEBUG_HPP



dbg::Debug debug;



class DCrossing {

public:

	void solve(std::istream& in, std::ostream& out) {

	    ll n;

	    in >> n;



	    ll buf = 1, cur = 2;

	    bool judge = false;

	    while(buf <= n){

            if(buf == n){

                judge = true;

                break;

            }

            buf += cur++;

	    }



	    if(!judge){

	        out << "No" << enl;

	        return;

	    }



	    vll res(cur, vl());

	    res[0].push_back(1);

	    res[1].push_back(1);

	    ll now = 1;

	    for(ll i=2; i<cur; i++){

	    	for(int j=now+1; j<=now+i; j++){

                res[i].push_back(j);

                res[j-now-1].push_back(j);

            }

            now += i;

	    }



	    out << "Yes" << enl;

	    out << cur << enl;

	    for(int i=0; i<cur; i++){

            out << res[i].size();

            for(int j=0; j<res[i].size(); j++){

                out << " " << res[i][j];

            }

            out << enl;

	    }

	}

};





int main() {

    cin.tie(nullptr);

    ios_base::sync_with_stdio(false);

	DCrossing solver;

	std::istream& in(std::cin);

	std::ostream& out(std::cout);

	solver.solve(in, out);

	return 0;

}


// Fastest known solution for this problem: